// Generated from e:\ffi\parser\C.g4 by ANTLR 4.9.2
// jshint ignore: start
import antlr4 from 'antlr4';
import CListener from './CListener.js';
import CVisitor from './CVisitor.js';


const serializedATN = ["\u0003\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786",
    "\u5964\u0003{\u0455\u0004\u0002\t\u0002\u0004\u0003\t\u0003\u0004\u0004",
    "\t\u0004\u0004\u0005\t\u0005\u0004\u0006\t\u0006\u0004\u0007\t\u0007",
    "\u0004\b\t\b\u0004\t\t\t\u0004\n\t\n\u0004\u000b\t\u000b\u0004\f\t\f",
    "\u0004\r\t\r\u0004\u000e\t\u000e\u0004\u000f\t\u000f\u0004\u0010\t\u0010",
    "\u0004\u0011\t\u0011\u0004\u0012\t\u0012\u0004\u0013\t\u0013\u0004\u0014",
    "\t\u0014\u0004\u0015\t\u0015\u0004\u0016\t\u0016\u0004\u0017\t\u0017",
    "\u0004\u0018\t\u0018\u0004\u0019\t\u0019\u0004\u001a\t\u001a\u0004\u001b",
    "\t\u001b\u0004\u001c\t\u001c\u0004\u001d\t\u001d\u0004\u001e\t\u001e",
    "\u0004\u001f\t\u001f\u0004 \t \u0004!\t!\u0004\"\t\"\u0004#\t#\u0004",
    "$\t$\u0004%\t%\u0004&\t&\u0004\'\t\'\u0004(\t(\u0004)\t)\u0004*\t*\u0004",
    "+\t+\u0004,\t,\u0004-\t-\u0004.\t.\u0004/\t/\u00040\t0\u00041\t1\u0004",
    "2\t2\u00043\t3\u00044\t4\u00045\t5\u00046\t6\u00047\t7\u00048\t8\u0004",
    "9\t9\u0004:\t:\u0004;\t;\u0004<\t<\u0004=\t=\u0004>\t>\u0004?\t?\u0004",
    "@\t@\u0004A\tA\u0004B\tB\u0004C\tC\u0004D\tD\u0004E\tE\u0004F\tF\u0004",
    "G\tG\u0004H\tH\u0004I\tI\u0004J\tJ\u0004K\tK\u0004L\tL\u0004M\tM\u0004",
    "N\tN\u0004O\tO\u0004P\tP\u0004Q\tQ\u0004R\tR\u0004S\tS\u0004T\tT\u0004",
    "U\tU\u0004V\tV\u0004W\tW\u0004X\tX\u0004Y\tY\u0003\u0002\u0005\u0002",
    "\u00b4\n\u0002\u0003\u0002\u0003\u0002\u0003\u0003\u0003\u0003\u0006",
    "\u0003\u00ba\n\u0003\r\u0003\u000e\u0003\u00bb\u0003\u0004\u0003\u0004",
    "\u0003\u0004\u0003\u0004\u0005\u0004\u00c2\n\u0004\u0003\u0005\u0005",
    "\u0005\u00c5\n\u0005\u0003\u0005\u0003\u0005\u0005\u0005\u00c9\n\u0005",
    "\u0003\u0005\u0003\u0005\u0003\u0006\u0006\u0006\u00ce\n\u0006\r\u0006",
    "\u000e\u0006\u00cf\u0003\u0007\u0003\u0007\u0005\u0007\u00d4\n\u0007",
    "\u0003\u0007\u0003\u0007\u0003\u0007\u0005\u0007\u00d9\n\u0007\u0003",
    "\b\u0006\b\u00dc\n\b\r\b\u000e\b\u00dd\u0003\t\u0003\t\u0003\t\u0007",
    "\t\u00e3\n\t\f\t\u000e\t\u00e6\u000b\t\u0003\n\u0003\n\u0003\n\u0005",
    "\n\u00eb\n\n\u0003\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003\u000b",
    "\u0006\u000b\u00f2\n\u000b\r\u000b\u000e\u000b\u00f3\u0003\u000b\u0003",
    "\u000b\u0003\u000b\u0003\f\u0003\f\u0003\f\u0003\f\u0005\f\u00fd\n\f",
    "\u0003\r\u0003\r\u0003\u000e\u0003\u000e\u0003\u000e\u0003\u000e\u0003",
    "\u000e\u0003\u000e\u0003\u000e\u0003\u000e\u0003\u000e\u0003\u000e\u0003",
    "\u000e\u0003\u000e\u0003\u000e\u0003\u000e\u0003\u000e\u0005\u000e\u0110",
    "\n\u000e\u0003\u000e\u0003\u000e\u0007\u000e\u0114\n\u000e\f\u000e\u000e",
    "\u000e\u0117\u000b\u000e\u0003\u000f\u0003\u000f\u0003\u000f\u0003\u000f",
    "\u0003\u000f\u0003\u0010\u0003\u0010\u0005\u0010\u0120\n\u0010\u0003",
    "\u0011\u0003\u0011\u0005\u0011\u0124\n\u0011\u0003\u0011\u0003\u0011",
    "\u0003\u0011\u0003\u0011\u0003\u0011\u0003\u0011\u0003\u0011\u0005\u0011",
    "\u012d\n\u0011\u0003\u0012\u0003\u0012\u0003\u0013\u0006\u0013\u0132",
    "\n\u0013\r\u0013\u000e\u0013\u0133\u0003\u0014\u0003\u0014\u0005\u0014",
    "\u0138\n\u0014\u0003\u0014\u0003\u0014\u0003\u0014\u0005\u0014\u013d",
    "\n\u0014\u0003\u0015\u0003\u0015\u0005\u0015\u0141\n\u0015\u0003\u0015",
    "\u0005\u0015\u0144\n\u0015\u0003\u0016\u0003\u0016\u0003\u0016\u0007",
    "\u0016\u0149\n\u0016\f\u0016\u000e\u0016\u014c\u000b\u0016\u0003\u0017",
    "\u0003\u0017\u0005\u0017\u0150\n\u0017\u0003\u0017\u0003\u0017\u0005",
    "\u0017\u0154\n\u0017\u0003\u0018\u0003\u0018\u0005\u0018\u0158\n\u0018",
    "\u0003\u0018\u0003\u0018\u0003\u0018\u0005\u0018\u015d\n\u0018\u0003",
    "\u0018\u0003\u0018\u0003\u0018\u0003\u0018\u0005\u0018\u0163\n\u0018",
    "\u0003\u0019\u0003\u0019\u0003\u0019\u0007\u0019\u0168\n\u0019\f\u0019",
    "\u000e\u0019\u016b\u000b\u0019\u0003\u001a\u0003\u001a\u0003\u001a\u0005",
    "\u001a\u0170\n\u001a\u0003\u001b\u0003\u001b\u0003\u001c\u0003\u001c",
    "\u0003\u001d\u0003\u001d\u0003\u001e\u0003\u001e\u0005\u001e\u017a\n",
    "\u001e\u0006\u001e\u017c\n\u001e\r\u001e\u000e\u001e\u017d\u0003\u001f",
    "\u0003\u001f\u0003 \u0003 \u0003 \u0003 \u0003 \u0003 \u0005 \u0188",
    "\n \u0003!\u0003!\u0003!\u0003!\u0003!\u0003!\u0003!\u0003\"\u0005\"",
    "\u0192\n\"\u0003\"\u0003\"\u0005\"\u0196\n\"\u0007\"\u0198\n\"\f\"\u000e",
    "\"\u019b\u000b\"\u0003#\u0003#\u0003#\u0005#\u01a0\n#\u0003#\u0005#",
    "\u01a3\n#\u0003$\u0003$\u0003$\u0003$\u0005$\u01a9\n$\u0003$\u0003$",
    "\u0003%\u0005%\u01ae\n%\u0003%\u0003%\u0007%\u01b2\n%\f%\u000e%\u01b5",
    "\u000b%\u0003%\u0003%\u0003%\u0005%\u01ba\n%\u0003&\u0003&\u0003&\u0003",
    "&\u0003&\u0003&\u0003&\u0003&\u0003&\u0003&\u0003&\u0003&\u0005&\u01c8",
    "\n&\u0003&\u0003&\u0003&\u0003&\u0005&\u01ce\n&\u0003&\u0003&\u0003",
    "&\u0005&\u01d3\n&\u0003&\u0005&\u01d6\n&\u0003&\u0003&\u0003&\u0003",
    "&\u0003&\u0005&\u01dd\n&\u0003&\u0003&\u0003&\u0003&\u0003&\u0003&\u0003",
    "&\u0003&\u0003&\u0003&\u0003&\u0003&\u0003&\u0005&\u01ec\n&\u0003&\u0003",
    "&\u0003&\u0003&\u0003&\u0003&\u0003&\u0003&\u0003&\u0003&\u0005&\u01f8",
    "\n&\u0003&\u0007&\u01fb\n&\f&\u000e&\u01fe\u000b&\u0003\'\u0006\'\u0201",
    "\n\'\r\'\u000e\'\u0202\u0003(\u0003(\u0003(\u0003(\u0003(\u0003(\u0005",
    "(\u020b\n(\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0005)\u0213\n",
    ")\u0003*\u0003*\u0003*\u0007*\u0218\n*\f*\u000e*\u021b\u000b*\u0003",
    "+\u0003+\u0003+\u0007+\u0220\n+\f+\u000e+\u0223\u000b+\u0003,\u0003",
    ",\u0003,\u0007,\u0228\n,\f,\u000e,\u022b\u000b,\u0003-\u0003-\u0003",
    "-\u0007-\u0230\n-\f-\u000e-\u0233\u000b-\u0003.\u0003.\u0003.\u0007",
    ".\u0238\n.\f.\u000e.\u023b\u000b.\u0003/\u0003/\u0003/\u0007/\u0240",
    "\n/\f/\u000e/\u0243\u000b/\u00030\u00030\u00030\u00070\u0248\n0\f0\u000e",
    "0\u024b\u000b0\u00031\u00031\u00031\u00071\u0250\n1\f1\u000e1\u0253",
    "\u000b1\u00032\u00032\u00032\u00072\u0258\n2\f2\u000e2\u025b\u000b2",
    "\u00033\u00033\u00033\u00073\u0260\n3\f3\u000e3\u0263\u000b3\u00034",
    "\u00054\u0266\n4\u00034\u00034\u00034\u00034\u00034\u00034\u00034\u0005",
    "4\u026f\n4\u00035\u00075\u0272\n5\f5\u000e5\u0275\u000b5\u00035\u0003",
    "5\u00035\u00035\u00035\u00035\u00035\u00035\u00035\u00035\u00035\u0005",
    "5\u0282\n5\u00036\u00036\u00056\u0286\n6\u00036\u00036\u00036\u0003",
    "6\u00036\u00036\u00056\u028e\n6\u00036\u00036\u00056\u0292\n6\u0003",
    "6\u00036\u00036\u00036\u00036\u00036\u00056\u029a\n6\u00036\u00036\u0003",
    "6\u00036\u00076\u02a0\n6\f6\u000e6\u02a3\u000b6\u00037\u00037\u0003",
    "7\u00067\u02a8\n7\r7\u000e7\u02a9\u00037\u00037\u00037\u00037\u0003",
    "7\u00037\u00057\u02b2\n7\u00037\u00037\u00037\u00037\u00037\u00037\u0003",
    "7\u00037\u00037\u00037\u00037\u00037\u00037\u00037\u00037\u00037\u0003",
    "7\u00037\u00057\u02c6\n7\u00038\u00038\u00038\u00038\u00038\u00038\u0003",
    "8\u00039\u00039\u00039\u00079\u02d2\n9\f9\u000e9\u02d5\u000b9\u0003",
    ":\u0003:\u0005:\u02d9\n:\u0003:\u0003:\u0003:\u0003;\u0003;\u0003;\u0007",
    ";\u02e1\n;\f;\u000e;\u02e4\u000b;\u0003<\u0003<\u0003=\u0003=\u0003",
    ">\u0003>\u0003>\u0005>\u02ed\n>\u0003?\u0003?\u0003?\u0007?\u02f2\n",
    "?\f?\u000e?\u02f5\u000b?\u0003@\u0003@\u0003@\u0003@\u0003@\u0005@\u02fc",
    "\n@\u0005@\u02fe\n@\u0003A\u0006A\u0301\nA\rA\u000eA\u0302\u0003B\u0003",
    "B\u0005B\u0307\nB\u0003B\u0003B\u0007B\u030b\nB\fB\u000eB\u030e\u000b",
    "B\u0005B\u0310\nB\u0003C\u0003C\u0003C\u0003C\u0003C\u0007C\u0317\n",
    "C\fC\u000eC\u031a\u000bC\u0003C\u0003C\u0005C\u031e\nC\u0003C\u0005",
    "C\u0321\nC\u0003C\u0003C\u0003C\u0003C\u0005C\u0327\nC\u0003C\u0003",
    "C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003",
    "C\u0003C\u0003C\u0005C\u0337\nC\u0003C\u0003C\u0007C\u033b\nC\fC\u000e",
    "C\u033e\u000bC\u0005C\u0340\nC\u0003C\u0003C\u0003C\u0005C\u0345\nC",
    "\u0003C\u0005C\u0348\nC\u0003C\u0003C\u0003C\u0003C\u0003C\u0005C\u034f",
    "\nC\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003",
    "C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0005C\u0362\nC\u0003",
    "C\u0003C\u0007C\u0366\nC\fC\u000eC\u0369\u000bC\u0007C\u036b\nC\fC\u000e",
    "C\u036e\u000bC\u0003D\u0003D\u0003D\u0006D\u0373\nD\rD\u000eD\u0374",
    "\u0003D\u0003D\u0005D\u0379\nD\u0003E\u0003E\u0003F\u0003F\u0003F\u0007",
    "F\u0380\nF\fF\u000eF\u0383\u000bF\u0003G\u0003G\u0003G\u0003G\u0005",
    "G\u0389\nG\u0003G\u0003G\u0005G\u038d\nG\u0003H\u0005H\u0390\nH\u0003",
    "H\u0003H\u0003H\u0005H\u0395\nH\u0003H\u0007H\u0398\nH\fH\u000eH\u039b",
    "\u000bH\u0003I\u0003I\u0003I\u0003J\u0006J\u03a1\nJ\rJ\u000eJ\u03a2",
    "\u0003K\u0003K\u0003K\u0003K\u0003K\u0003K\u0005K\u03ab\nK\u0003L\u0003",
    "L\u0003L\u0003L\u0003L\u0003L\u0003L\u0003L\u0003L\u0003L\u0003L\u0003",
    "L\u0007L\u03b9\nL\fL\u000eL\u03bc\u000bL\u0005L\u03be\nL\u0003L\u0003",
    "L\u0003L\u0003L\u0007L\u03c4\nL\fL\u000eL\u03c7\u000bL\u0005L\u03c9",
    "\nL\u0007L\u03cb\nL\fL\u000eL\u03ce\u000bL\u0003L\u0003L\u0005L\u03d2",
    "\nL\u0003M\u0003M\u0003M\u0003M\u0003M\u0007M\u03d9\nM\fM\u000eM\u03dc",
    "\u000bM\u0003N\u0003N\u0003N\u0003N\u0003N\u0003N\u0003N\u0003N\u0003",
    "N\u0003N\u0003N\u0005N\u03e9\nN\u0003O\u0003O\u0005O\u03ed\nO\u0003",
    "O\u0003O\u0003P\u0005P\u03f2\nP\u0003P\u0003P\u0003Q\u0003Q\u0003Q\u0003",
    "Q\u0003Q\u0003Q\u0003Q\u0005Q\u03fd\nQ\u0003Q\u0003Q\u0003Q\u0003Q\u0003",
    "Q\u0003Q\u0005Q\u0405\nQ\u0003R\u0003R\u0003R\u0003R\u0003R\u0003R\u0003",
    "R\u0003R\u0003R\u0003R\u0003R\u0003R\u0003R\u0003R\u0003R\u0003R\u0003",
    "R\u0003R\u0003R\u0003R\u0005R\u041b\nR\u0003S\u0003S\u0005S\u041f\n",
    "S\u0005S\u0421\nS\u0003S\u0003S\u0005S\u0425\nS\u0003S\u0003S\u0005",
    "S\u0429\nS\u0003T\u0003T\u0005T\u042d\nT\u0003U\u0003U\u0003U\u0007",
    "U\u0432\nU\fU\u000eU\u0435\u000bU\u0003V\u0003V\u0003V\u0003V\u0003",
    "V\u0005V\u043c\nV\u0003V\u0003V\u0005V\u0440\nV\u0003V\u0003V\u0003",
    "W\u0003W\u0003W\u0007W\u0447\nW\fW\u000eW\u044a\u000bW\u0003X\u0006",
    "X\u044d\nX\rX\u000eX\u044e\u0003Y\u0003Y\u0005Y\u0453\nY\u0003Y\u0002",
    "\u0005\u001aJ\u0084Z\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014",
    "\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bd",
    "fhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090",
    "\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8",
    "\u00aa\u00ac\u00ae\u00b0\u0002\u0019\t\u0002\u0013\u0013\u0017\u0017",
    "\u001e\u001e&&,,//>>\n\u0002\u0003\u0005\u0016\u0016\u001b\u001b\u001f",
    "\u001f$%)*1289\u0003\u0002\u0003\u0005\u0004\u0002--00\u0004\u0002O",
    "OVV\u0006\u0002\u0017\u0017\'\'3377\u0005\u0002\b\t##<<\u0004\u0002",
    "?@\\\\\u0003\u0002hi\u0003\u0002EH\u0003\u0002IJ\u0004\u0002KKMM\u0003",
    "\u0002OQ\u0005\u0002++LLNN\u0004\u0002++66\u0003\u0002jk\u0004\u0002",
    "LLNN\u0007\u0002KKMMOORRWX\u0003\u0002]g\u0003\u0002\u000e\u000f\u0004",
    "\u0002\u0010\u001033\u0003\u0002?@\u0004\u0002\u0014\u0014\u0018\u0018",
    "\u0002\u04b5\u0002\u00b3\u0003\u0002\u0002\u0002\u0004\u00b9\u0003\u0002",
    "\u0002\u0002\u0006\u00c1\u0003\u0002\u0002\u0002\b\u00c4\u0003\u0002",
    "\u0002\u0002\n\u00cd\u0003\u0002\u0002\u0002\f\u00d8\u0003\u0002\u0002",
    "\u0002\u000e\u00db\u0003\u0002\u0002\u0002\u0010\u00df\u0003\u0002\u0002",
    "\u0002\u0012\u00e7\u0003\u0002\u0002\u0002\u0014\u00ec\u0003\u0002\u0002",
    "\u0002\u0016\u00fc\u0003\u0002\u0002\u0002\u0018\u00fe\u0003\u0002\u0002",
    "\u0002\u001a\u010f\u0003\u0002\u0002\u0002\u001c\u0118\u0003\u0002\u0002",
    "\u0002\u001e\u011d\u0003\u0002\u0002\u0002 \u012c\u0003\u0002\u0002",
    "\u0002\"\u012e\u0003\u0002\u0002\u0002$\u0131\u0003\u0002\u0002\u0002",
    "&\u013c\u0003\u0002\u0002\u0002(\u0140\u0003\u0002\u0002\u0002*\u0145",
    "\u0003\u0002\u0002\u0002,\u0153\u0003\u0002\u0002\u0002.\u0162\u0003",
    "\u0002\u0002\u00020\u0164\u0003\u0002\u0002\u00022\u016c\u0003\u0002",
    "\u0002\u00024\u0171\u0003\u0002\u0002\u00026\u0173\u0003\u0002\u0002",
    "\u00028\u0175\u0003\u0002\u0002\u0002:\u017b\u0003\u0002\u0002\u0002",
    "<\u017f\u0003\u0002\u0002\u0002>\u0187\u0003\u0002\u0002\u0002@\u0189",
    "\u0003\u0002\u0002\u0002B\u0191\u0003\u0002\u0002\u0002D\u019c\u0003",
    "\u0002\u0002\u0002F\u01a4\u0003\u0002\u0002\u0002H\u01b9\u0003\u0002",
    "\u0002\u0002J\u01cd\u0003\u0002\u0002\u0002L\u0200\u0003\u0002\u0002",
    "\u0002N\u020a\u0003\u0002\u0002\u0002P\u020c\u0003\u0002\u0002\u0002",
    "R\u0214\u0003\u0002\u0002\u0002T\u021c\u0003\u0002\u0002\u0002V\u0224",
    "\u0003\u0002\u0002\u0002X\u022c\u0003\u0002\u0002\u0002Z\u0234\u0003",
    "\u0002\u0002\u0002\\\u023c\u0003\u0002\u0002\u0002^\u0244\u0003\u0002",
    "\u0002\u0002`\u024c\u0003\u0002\u0002\u0002b\u0254\u0003\u0002\u0002",
    "\u0002d\u025c\u0003\u0002\u0002\u0002f\u026e\u0003\u0002\u0002\u0002",
    "h\u0273\u0003\u0002\u0002\u0002j\u0291\u0003\u0002\u0002\u0002l\u02c5",
    "\u0003\u0002\u0002\u0002n\u02c7\u0003\u0002\u0002\u0002p\u02ce\u0003",
    "\u0002\u0002\u0002r\u02d8\u0003\u0002\u0002\u0002t\u02dd\u0003\u0002",
    "\u0002\u0002v\u02e5\u0003\u0002\u0002\u0002x\u02e7\u0003\u0002\u0002",
    "\u0002z\u02e9\u0003\u0002\u0002\u0002|\u02ee\u0003\u0002\u0002\u0002",
    "~\u02fd\u0003\u0002\u0002\u0002\u0080\u0300\u0003\u0002\u0002\u0002",
    "\u0082\u030f\u0003\u0002\u0002\u0002\u0084\u033f\u0003\u0002\u0002\u0002",
    "\u0086\u0378\u0003\u0002\u0002\u0002\u0088\u037a\u0003\u0002\u0002\u0002",
    "\u008a\u037c\u0003\u0002\u0002\u0002\u008c\u038c\u0003\u0002\u0002\u0002",
    "\u008e\u038f\u0003\u0002\u0002\u0002\u0090\u039c\u0003\u0002\u0002\u0002",
    "\u0092\u03a0\u0003\u0002\u0002\u0002\u0094\u03aa\u0003\u0002\u0002\u0002",
    "\u0096\u03d1\u0003\u0002\u0002\u0002\u0098\u03da\u0003\u0002\u0002\u0002",
    "\u009a\u03e8\u0003\u0002\u0002\u0002\u009c\u03ea\u0003\u0002\u0002\u0002",
    "\u009e\u03f1\u0003\u0002\u0002\u0002\u00a0\u0404\u0003\u0002\u0002\u0002",
    "\u00a2\u041a\u0003\u0002\u0002\u0002\u00a4\u0420\u0003\u0002\u0002\u0002",
    "\u00a6\u042a\u0003\u0002\u0002\u0002\u00a8\u042e\u0003\u0002\u0002\u0002",
    "\u00aa\u043f\u0003\u0002\u0002\u0002\u00ac\u0443\u0003\u0002\u0002\u0002",
    "\u00ae\u044c\u0003\u0002\u0002\u0002\u00b0\u0452\u0003\u0002\u0002\u0002",
    "\u00b2\u00b4\u0005\u0004\u0003\u0002\u00b3\u00b2\u0003\u0002\u0002\u0002",
    "\u00b3\u00b4\u0003\u0002\u0002\u0002\u00b4\u00b5\u0003\u0002\u0002\u0002",
    "\u00b5\u00b6\u0007\u0002\u0002\u0003\u00b6\u0003\u0003\u0002\u0002\u0002",
    "\u00b7\u00ba\u0007w\u0002\u0002\u00b8\u00ba\u0005\u0006\u0004\u0002",
    "\u00b9\u00b7\u0003\u0002\u0002\u0002\u00b9\u00b8\u0003\u0002\u0002\u0002",
    "\u00ba\u00bb\u0003\u0002\u0002\u0002\u00bb\u00b9\u0003\u0002\u0002\u0002",
    "\u00bb\u00bc\u0003\u0002\u0002\u0002\u00bc\u0005\u0003\u0002\u0002\u0002",
    "\u00bd\u00c2\u0007v\u0002\u0002\u00be\u00c2\u0005\b\u0005\u0002\u00bf",
    "\u00c2\u0005\f\u0007\u0002\u00c0\u00c2\u0007[\u0002\u0002\u00c1\u00bd",
    "\u0003\u0002\u0002\u0002\u00c1\u00be\u0003\u0002\u0002\u0002\u00c1\u00bf",
    "\u0003\u0002\u0002\u0002\u00c1\u00c0\u0003\u0002\u0002\u0002\u00c2\u0007",
    "\u0003\u0002\u0002\u0002\u00c3\u00c5\u0005\u000e\b\u0002\u00c4\u00c3",
    "\u0003\u0002\u0002\u0002\u00c4\u00c5\u0003\u0002\u0002\u0002\u00c5\u00c6",
    "\u0003\u0002\u0002\u0002\u00c6\u00c8\u0005H%\u0002\u00c7\u00c9\u0005",
    "\n\u0006\u0002\u00c8\u00c7\u0003\u0002\u0002\u0002\u00c8\u00c9\u0003",
    "\u0002\u0002\u0002\u00c9\u00ca\u0003\u0002\u0002\u0002\u00ca\u00cb\u0005",
    "\u009cO\u0002\u00cb\t\u0003\u0002\u0002\u0002\u00cc\u00ce\u0005\f\u0007",
    "\u0002\u00cd\u00cc\u0003\u0002\u0002\u0002\u00ce\u00cf\u0003\u0002\u0002",
    "\u0002\u00cf\u00cd\u0003\u0002\u0002\u0002\u00cf\u00d0\u0003\u0002\u0002",
    "\u0002\u00d0\u000b\u0003\u0002\u0002\u0002\u00d1\u00d3\u0005\u000e\b",
    "\u0002\u00d2\u00d4\u0005\u0010\t\u0002\u00d3\u00d2\u0003\u0002\u0002",
    "\u0002\u00d3\u00d4\u0003\u0002\u0002\u0002\u00d4\u00d5\u0003\u0002\u0002",
    "\u0002\u00d5\u00d6\u0007[\u0002\u0002\u00d6\u00d9\u0003\u0002\u0002",
    "\u0002\u00d7\u00d9\u0005\u0014\u000b\u0002\u00d8\u00d1\u0003\u0002\u0002",
    "\u0002\u00d8\u00d7\u0003\u0002\u0002\u0002\u00d9\r\u0003\u0002\u0002",
    "\u0002\u00da\u00dc\u0005\u0016\f\u0002\u00db\u00da\u0003\u0002\u0002",
    "\u0002\u00dc\u00dd\u0003\u0002\u0002\u0002\u00dd\u00db\u0003\u0002\u0002",
    "\u0002\u00dd\u00de\u0003\u0002\u0002\u0002\u00de\u000f\u0003\u0002\u0002",
    "\u0002\u00df\u00e4\u0005\u0012\n\u0002\u00e0\u00e1\u0007\\\u0002\u0002",
    "\u00e1\u00e3\u0005\u0012\n\u0002\u00e2\u00e0\u0003\u0002\u0002\u0002",
    "\u00e3\u00e6\u0003\u0002\u0002\u0002\u00e4\u00e2\u0003\u0002\u0002\u0002",
    "\u00e4\u00e5\u0003\u0002\u0002\u0002\u00e5\u0011\u0003\u0002\u0002\u0002",
    "\u00e6\u00e4\u0003\u0002\u0002\u0002\u00e7\u00ea\u0005H%\u0002\u00e8",
    "\u00e9\u0007]\u0002\u0002\u00e9\u00eb\u0005\u008cG\u0002\u00ea\u00e8",
    "\u0003\u0002\u0002\u0002\u00ea\u00eb\u0003\u0002\u0002\u0002\u00eb\u0013",
    "\u0003\u0002\u0002\u0002\u00ec\u00ed\u0007=\u0002\u0002\u00ed\u00ee",
    "\u0007?\u0002\u0002\u00ee\u00ef\u00058\u001d\u0002\u00ef\u00f1\u0007",
    "\\\u0002\u0002\u00f0\u00f2\u0007\u0012\u0002\u0002\u00f1\u00f0\u0003",
    "\u0002\u0002\u0002\u00f2\u00f3\u0003\u0002\u0002\u0002\u00f3\u00f1\u0003",
    "\u0002\u0002\u0002\u00f3\u00f4\u0003\u0002\u0002\u0002\u00f4\u00f5\u0003",
    "\u0002\u0002\u0002\u00f5\u00f6\u0007@\u0002\u0002\u00f6\u00f7\u0007",
    "[\u0002\u0002\u00f7\u0015\u0003\u0002\u0002\u0002\u00f8\u00fd\u0005",
    "\u0018\r\u0002\u00f9\u00fd\u0005\u001a\u000e\u0002\u00fa\u00fd\u0005",
    "> \u0002\u00fb\u00fd\u0005F$\u0002\u00fc\u00f8\u0003\u0002\u0002\u0002",
    "\u00fc\u00f9\u0003\u0002\u0002\u0002\u00fc\u00fa\u0003\u0002\u0002\u0002",
    "\u00fc\u00fb\u0003\u0002\u0002\u0002\u00fd\u0017\u0003\u0002\u0002\u0002",
    "\u00fe\u00ff\t\u0002\u0002\u0002\u00ff\u0019\u0003\u0002\u0002\u0002",
    "\u0100\u0101\b\u000e\u0001\u0002\u0101\u0110\t\u0003\u0002\u0002\u0102",
    "\u0103\u0007\u0006\u0002\u0002\u0103\u0104\u0007?\u0002\u0002\u0104",
    "\u0105\t\u0004\u0002\u0002\u0105\u0110\u0007@\u0002\u0002\u0106\u0110",
    "\u0005\u001c\u000f\u0002\u0107\u0110\u0005 \u0011\u0002\u0108\u0110",
    "\u0005.\u0018\u0002\u0109\u0110\u00056\u001c\u0002\u010a\u010b\u0007",
    "\u0007\u0002\u0002\u010b\u010c\u0007?\u0002\u0002\u010c\u010d\u0005",
    "8\u001d\u0002\u010d\u010e\u0007@\u0002\u0002\u010e\u0110\u0003\u0002",
    "\u0002\u0002\u010f\u0100\u0003\u0002\u0002\u0002\u010f\u0102\u0003\u0002",
    "\u0002\u0002\u010f\u0106\u0003\u0002\u0002\u0002\u010f\u0107\u0003\u0002",
    "\u0002\u0002\u010f\u0108\u0003\u0002\u0002\u0002\u010f\u0109\u0003\u0002",
    "\u0002\u0002\u010f\u010a\u0003\u0002\u0002\u0002\u0110\u0115\u0003\u0002",
    "\u0002\u0002\u0111\u0112\f\u0003\u0002\u0002\u0112\u0114\u0005:\u001e",
    "\u0002\u0113\u0111\u0003\u0002\u0002\u0002\u0114\u0117\u0003\u0002\u0002",
    "\u0002\u0115\u0113\u0003\u0002\u0002\u0002\u0115\u0116\u0003\u0002\u0002",
    "\u0002\u0116\u001b\u0003\u0002\u0002\u0002\u0117\u0115\u0003\u0002\u0002",
    "\u0002\u0118\u0119\u00077\u0002\u0002\u0119\u011a\u0007?\u0002\u0002",
    "\u011a\u011b\u0005\u001e\u0010\u0002\u011b\u011c\u0007@\u0002\u0002",
    "\u011c\u001d\u0003\u0002\u0002\u0002\u011d\u011f\u0005(\u0015\u0002",
    "\u011e\u0120\u0005\u0082B\u0002\u011f\u011e\u0003\u0002\u0002\u0002",
    "\u011f\u0120\u0003\u0002\u0002\u0002\u0120\u001f\u0003\u0002\u0002\u0002",
    "\u0121\u0123\u0005\"\u0012\u0002\u0122\u0124\u0007m\u0002\u0002\u0123",
    "\u0122\u0003\u0002\u0002\u0002\u0123\u0124\u0003\u0002\u0002\u0002\u0124",
    "\u0125\u0003\u0002\u0002\u0002\u0125\u0126\u0007C\u0002\u0002\u0126",
    "\u0127\u0005$\u0013\u0002\u0127\u0128\u0007D\u0002\u0002\u0128\u012d",
    "\u0003\u0002\u0002\u0002\u0129\u012a\u0005\"\u0012\u0002\u012a\u012b",
    "\u0007m\u0002\u0002\u012b\u012d\u0003\u0002\u0002\u0002\u012c\u0121",
    "\u0003\u0002\u0002\u0002\u012c\u0129\u0003\u0002\u0002\u0002\u012d!",
    "\u0003\u0002\u0002\u0002\u012e\u012f\t\u0005\u0002\u0002\u012f#\u0003",
    "\u0002\u0002\u0002\u0130\u0132\u0005&\u0014\u0002\u0131\u0130\u0003",
    "\u0002\u0002\u0002\u0132\u0133\u0003\u0002\u0002\u0002\u0133\u0131\u0003",
    "\u0002\u0002\u0002\u0133\u0134\u0003\u0002\u0002\u0002\u0134%\u0003",
    "\u0002\u0002\u0002\u0135\u0137\u0005(\u0015\u0002\u0136\u0138\u0005",
    "*\u0016\u0002\u0137\u0136\u0003\u0002\u0002\u0002\u0137\u0138\u0003",
    "\u0002\u0002\u0002\u0138\u0139\u0003\u0002\u0002\u0002\u0139\u013a\u0007",
    "[\u0002\u0002\u013a\u013d\u0003\u0002\u0002\u0002\u013b\u013d\u0005",
    "\u0014\u000b\u0002\u013c\u0135\u0003\u0002\u0002\u0002\u013c\u013b\u0003",
    "\u0002\u0002\u0002\u013d\'\u0003\u0002\u0002\u0002\u013e\u0141\u0005",
    "\u001a\u000e\u0002\u013f\u0141\u0005<\u001f\u0002\u0140\u013e\u0003",
    "\u0002\u0002\u0002\u0140\u013f\u0003\u0002\u0002\u0002\u0141\u0143\u0003",
    "\u0002\u0002\u0002\u0142\u0144\u0005(\u0015\u0002\u0143\u0142\u0003",
    "\u0002\u0002\u0002\u0143\u0144\u0003\u0002\u0002\u0002\u0144)\u0003",
    "\u0002\u0002\u0002\u0145\u014a\u0005,\u0017\u0002\u0146\u0147\u0007",
    "\\\u0002\u0002\u0147\u0149\u0005,\u0017\u0002\u0148\u0146\u0003\u0002",
    "\u0002\u0002\u0149\u014c\u0003\u0002\u0002\u0002\u014a\u0148\u0003\u0002",
    "\u0002\u0002\u014a\u014b\u0003\u0002\u0002\u0002\u014b+\u0003\u0002",
    "\u0002\u0002\u014c\u014a\u0003\u0002\u0002\u0002\u014d\u0154\u0005H",
    "%\u0002\u014e\u0150\u0005H%\u0002\u014f\u014e\u0003\u0002\u0002\u0002",
    "\u014f\u0150\u0003\u0002\u0002\u0002\u0150\u0151\u0003\u0002\u0002\u0002",
    "\u0151\u0152\u0007Z\u0002\u0002\u0152\u0154\u00058\u001d\u0002\u0153",
    "\u014d\u0003\u0002\u0002\u0002\u0153\u014f\u0003\u0002\u0002\u0002\u0154",
    "-\u0003\u0002\u0002\u0002\u0155\u0157\u0007\u001d\u0002\u0002\u0156",
    "\u0158\u0007m\u0002\u0002\u0157\u0156\u0003\u0002\u0002\u0002\u0157",
    "\u0158\u0003\u0002\u0002\u0002\u0158\u0159\u0003\u0002\u0002\u0002\u0159",
    "\u015a\u0007C\u0002\u0002\u015a\u015c\u00050\u0019\u0002\u015b\u015d",
    "\u0007\\\u0002\u0002\u015c\u015b\u0003\u0002\u0002\u0002\u015c\u015d",
    "\u0003\u0002\u0002\u0002\u015d\u015e\u0003\u0002\u0002\u0002\u015e\u015f",
    "\u0007D\u0002\u0002\u015f\u0163\u0003\u0002\u0002\u0002\u0160\u0161",
    "\u0007\u001d\u0002\u0002\u0161\u0163\u0007m\u0002\u0002\u0162\u0155",
    "\u0003\u0002\u0002\u0002\u0162\u0160\u0003\u0002\u0002\u0002\u0163/",
    "\u0003\u0002\u0002\u0002\u0164\u0169\u00052\u001a\u0002\u0165\u0166",
    "\u0007\\\u0002\u0002\u0166\u0168\u00052\u001a\u0002\u0167\u0165\u0003",
    "\u0002\u0002\u0002\u0168\u016b\u0003\u0002\u0002\u0002\u0169\u0167\u0003",
    "\u0002\u0002\u0002\u0169\u016a\u0003\u0002\u0002\u0002\u016a1\u0003",
    "\u0002\u0002\u0002\u016b\u0169\u0003\u0002\u0002\u0002\u016c\u016f\u0005",
    "4\u001b\u0002\u016d\u016e\u0007]\u0002\u0002\u016e\u0170\u00058\u001d",
    "\u0002\u016f\u016d\u0003\u0002\u0002\u0002\u016f\u0170\u0003\u0002\u0002",
    "\u0002\u01703\u0003\u0002\u0002\u0002\u0171\u0172\u0007m\u0002\u0002",
    "\u01725\u0003\u0002\u0002\u0002\u0173\u0174\u0007m\u0002\u0002\u0174",
    "7\u0003\u0002\u0002\u0002\u0175\u0176\u0005P)\u0002\u01769\u0003\u0002",
    "\u0002\u0002\u0177\u0179\t\u0006\u0002\u0002\u0178\u017a\u0005L\'\u0002",
    "\u0179\u0178\u0003\u0002\u0002\u0002\u0179\u017a\u0003\u0002\u0002\u0002",
    "\u017a\u017c\u0003\u0002\u0002\u0002\u017b\u0177\u0003\u0002\u0002\u0002",
    "\u017c\u017d\u0003\u0002\u0002\u0002\u017d\u017b\u0003\u0002\u0002\u0002",
    "\u017d\u017e\u0003\u0002\u0002\u0002\u017e;\u0003\u0002\u0002\u0002",
    "\u017f\u0180\t\u0007\u0002\u0002\u0180=\u0003\u0002\u0002\u0002\u0181",
    "\u0188\t\b\u0002\u0002\u0182\u0188\u0005@!\u0002\u0183\u0184\u0007\n",
    "\u0002\u0002\u0184\u0185\u0007?\u0002\u0002\u0185\u0186\u0007m\u0002",
    "\u0002\u0186\u0188\u0007@\u0002\u0002\u0187\u0181\u0003\u0002\u0002",
    "\u0002\u0187\u0182\u0003\u0002\u0002\u0002\u0187\u0183\u0003\u0002\u0002",
    "\u0002\u0188?\u0003\u0002\u0002\u0002\u0189\u018a\u0007\u000b\u0002",
    "\u0002\u018a\u018b\u0007?\u0002\u0002\u018b\u018c\u0007?\u0002\u0002",
    "\u018c\u018d\u0005B\"\u0002\u018d\u018e\u0007@\u0002\u0002\u018e\u018f",
    "\u0007@\u0002\u0002\u018fA\u0003\u0002\u0002\u0002\u0190\u0192\u0005",
    "D#\u0002\u0191\u0190\u0003\u0002\u0002\u0002\u0191\u0192\u0003\u0002",
    "\u0002\u0002\u0192\u0199\u0003\u0002\u0002\u0002\u0193\u0195\u0007\\",
    "\u0002\u0002\u0194\u0196\u0005D#\u0002\u0195\u0194\u0003\u0002\u0002",
    "\u0002\u0195\u0196\u0003\u0002\u0002\u0002\u0196\u0198\u0003\u0002\u0002",
    "\u0002\u0197\u0193\u0003\u0002\u0002\u0002\u0198\u019b\u0003\u0002\u0002",
    "\u0002\u0199\u0197\u0003\u0002\u0002\u0002\u0199\u019a\u0003\u0002\u0002",
    "\u0002\u019aC\u0003\u0002\u0002\u0002\u019b\u0199\u0003\u0002\u0002",
    "\u0002\u019c\u01a2\n\t\u0002\u0002\u019d\u019f\u0007?\u0002\u0002\u019e",
    "\u01a0\u0005t;\u0002\u019f\u019e\u0003\u0002\u0002\u0002\u019f\u01a0",
    "\u0003\u0002\u0002\u0002\u01a0\u01a1\u0003\u0002\u0002\u0002\u01a1\u01a3",
    "\u0007@\u0002\u0002\u01a2\u019d\u0003\u0002\u0002\u0002\u01a2\u01a3",
    "\u0003\u0002\u0002\u0002\u01a3E\u0003\u0002\u0002\u0002\u01a4\u01a5",
    "\u00075\u0002\u0002\u01a5\u01a8\u0007?\u0002\u0002\u01a6\u01a9\u0005",
    "\u001e\u0010\u0002\u01a7\u01a9\u00058\u001d\u0002\u01a8\u01a6\u0003",
    "\u0002\u0002\u0002\u01a8\u01a7\u0003\u0002\u0002\u0002\u01a9\u01aa\u0003",
    "\u0002\u0002\u0002\u01aa\u01ab\u0007@\u0002\u0002\u01abG\u0003\u0002",
    "\u0002\u0002\u01ac\u01ae\u0005:\u001e\u0002\u01ad\u01ac\u0003\u0002",
    "\u0002\u0002\u01ad\u01ae\u0003\u0002\u0002\u0002\u01ae\u01af\u0003\u0002",
    "\u0002\u0002\u01af\u01b3\u0005J&\u0002\u01b0\u01b2\u0005\u0086D\u0002",
    "\u01b1\u01b0\u0003\u0002\u0002\u0002\u01b2\u01b5\u0003\u0002\u0002\u0002",
    "\u01b3\u01b1\u0003\u0002\u0002\u0002\u01b3\u01b4\u0003\u0002\u0002\u0002",
    "\u01b4\u01ba\u0003\u0002\u0002\u0002\u01b5\u01b3\u0003\u0002\u0002\u0002",
    "\u01b6\u01ba\u0007o\u0002\u0002\u01b7\u01ba\u0007q\u0002\u0002\u01b8",
    "\u01ba\u0007v\u0002\u0002\u01b9\u01ad\u0003\u0002\u0002\u0002\u01b9",
    "\u01b6\u0003\u0002\u0002\u0002\u01b9\u01b7\u0003\u0002\u0002\u0002\u01b9",
    "\u01b8\u0003\u0002\u0002\u0002\u01baI\u0003\u0002\u0002\u0002\u01bb",
    "\u01bc\b&\u0001\u0002\u01bc\u01ce\u0005\u0088E\u0002\u01bd\u01be\u0007",
    "?\u0002\u0002\u01be\u01bf\u0005H%\u0002\u01bf\u01c0\u0007@\u0002\u0002",
    "\u01c0\u01ce\u0003\u0002\u0002\u0002\u01c1\u01c2\u0005\u0088E\u0002",
    "\u01c2\u01c3\u0007Z\u0002\u0002\u01c3\u01c4\u0007n\u0002\u0002\u01c4",
    "\u01ce\u0003\u0002\u0002\u0002\u01c5\u01c7\u0007?\u0002\u0002\u01c6",
    "\u01c8\u0005\u001a\u000e\u0002\u01c7\u01c6\u0003\u0002\u0002\u0002\u01c7",
    "\u01c8\u0003\u0002\u0002\u0002\u01c8\u01c9\u0003\u0002\u0002\u0002\u01c9",
    "\u01ca\u0005:\u001e\u0002\u01ca\u01cb\u0005J&\u0002\u01cb\u01cc\u0007",
    "@\u0002\u0002\u01cc\u01ce\u0003\u0002\u0002\u0002\u01cd\u01bb\u0003",
    "\u0002\u0002\u0002\u01cd\u01bd\u0003\u0002\u0002\u0002\u01cd\u01c1\u0003",
    "\u0002\u0002\u0002\u01cd\u01c5\u0003\u0002\u0002\u0002\u01ce\u01fc\u0003",
    "\u0002\u0002\u0002\u01cf\u01d0\f\n\u0002\u0002\u01d0\u01d2\u0007A\u0002",
    "\u0002\u01d1\u01d3\u0005L\'\u0002\u01d2\u01d1\u0003\u0002\u0002\u0002",
    "\u01d2\u01d3\u0003\u0002\u0002\u0002\u01d3\u01d5\u0003\u0002\u0002\u0002",
    "\u01d4\u01d6\u0005N(\u0002\u01d5\u01d4\u0003\u0002\u0002\u0002\u01d5",
    "\u01d6\u0003\u0002\u0002\u0002\u01d6\u01d7\u0003\u0002\u0002\u0002\u01d7",
    "\u01fb\u0007B\u0002\u0002\u01d8\u01d9\f\t\u0002\u0002\u01d9\u01da\u0007",
    "A\u0002\u0002\u01da\u01dc\u0007,\u0002\u0002\u01db\u01dd\u0005L\'\u0002",
    "\u01dc\u01db\u0003\u0002\u0002\u0002\u01dc\u01dd\u0003\u0002\u0002\u0002",
    "\u01dd\u01de\u0003\u0002\u0002\u0002\u01de\u01df\u0005N(\u0002\u01df",
    "\u01e0\u0007B\u0002\u0002\u01e0\u01fb\u0003\u0002\u0002\u0002\u01e1",
    "\u01e2\f\b\u0002\u0002\u01e2\u01e3\u0007A\u0002\u0002\u01e3\u01e4\u0005",
    "L\'\u0002\u01e4\u01e5\u0007,\u0002\u0002\u01e5\u01e6\u0005N(\u0002\u01e6",
    "\u01e7\u0007B\u0002\u0002\u01e7\u01fb\u0003\u0002\u0002\u0002\u01e8",
    "\u01e9\f\u0007\u0002\u0002\u01e9\u01eb\u0007A\u0002\u0002\u01ea\u01ec",
    "\u0005L\'\u0002\u01eb\u01ea\u0003\u0002\u0002\u0002\u01eb\u01ec\u0003",
    "\u0002\u0002\u0002\u01ec\u01ed\u0003\u0002\u0002\u0002\u01ed\u01ee\u0007",
    "O\u0002\u0002\u01ee\u01fb\u0007B\u0002\u0002\u01ef\u01f0\f\u0006\u0002",
    "\u0002\u01f0\u01f1\u0007?\u0002\u0002\u01f1\u01f2\u0005z>\u0002\u01f2",
    "\u01f3\u0007@\u0002\u0002\u01f3\u01fb\u0003\u0002\u0002\u0002\u01f4",
    "\u01f5\f\u0005\u0002\u0002\u01f5\u01f7\u0007?\u0002\u0002\u01f6\u01f8",
    "\u0005\u008aF\u0002\u01f7\u01f6\u0003\u0002\u0002\u0002\u01f7\u01f8",
    "\u0003\u0002\u0002\u0002\u01f8\u01f9\u0003\u0002\u0002\u0002\u01f9\u01fb",
    "\u0007@\u0002\u0002\u01fa\u01cf\u0003\u0002\u0002\u0002\u01fa\u01d8",
    "\u0003\u0002\u0002\u0002\u01fa\u01e1\u0003\u0002\u0002\u0002\u01fa\u01e8",
    "\u0003\u0002\u0002\u0002\u01fa\u01ef\u0003\u0002\u0002\u0002\u01fa\u01f4",
    "\u0003\u0002\u0002\u0002\u01fb\u01fe\u0003\u0002\u0002\u0002\u01fc\u01fa",
    "\u0003\u0002\u0002\u0002\u01fc\u01fd\u0003\u0002\u0002\u0002\u01fdK",
    "\u0003\u0002\u0002\u0002\u01fe\u01fc\u0003\u0002\u0002\u0002\u01ff\u0201",
    "\u0005<\u001f\u0002\u0200\u01ff\u0003\u0002\u0002\u0002\u0201\u0202",
    "\u0003\u0002\u0002\u0002\u0202\u0200\u0003\u0002\u0002\u0002\u0202\u0203",
    "\u0003\u0002\u0002\u0002\u0203M\u0003\u0002\u0002\u0002\u0204\u020b",
    "\u0005P)\u0002\u0205\u0206\u0005h5\u0002\u0206\u0207\u0005x=\u0002\u0207",
    "\u0208\u0005N(\u0002\u0208\u020b\u0003\u0002\u0002\u0002\u0209\u020b",
    "\u0007n\u0002\u0002\u020a\u0204\u0003\u0002\u0002\u0002\u020a\u0205",
    "\u0003\u0002\u0002\u0002\u020a\u0209\u0003\u0002\u0002\u0002\u020bO",
    "\u0003\u0002\u0002\u0002\u020c\u0212\u0005R*\u0002\u020d\u020e\u0007",
    "Y\u0002\u0002\u020e\u020f\u0005\u00acW\u0002\u020f\u0210\u0007Z\u0002",
    "\u0002\u0210\u0211\u0005P)\u0002\u0211\u0213\u0003\u0002\u0002\u0002",
    "\u0212\u020d\u0003\u0002\u0002\u0002\u0212\u0213\u0003\u0002\u0002\u0002",
    "\u0213Q\u0003\u0002\u0002\u0002\u0214\u0219\u0005T+\u0002\u0215\u0216",
    "\u0007U\u0002\u0002\u0216\u0218\u0005T+\u0002\u0217\u0215\u0003\u0002",
    "\u0002\u0002\u0218\u021b\u0003\u0002\u0002\u0002\u0219\u0217\u0003\u0002",
    "\u0002\u0002\u0219\u021a\u0003\u0002\u0002\u0002\u021aS\u0003\u0002",
    "\u0002\u0002\u021b\u0219\u0003\u0002\u0002\u0002\u021c\u0221\u0005V",
    ",\u0002\u021d\u021e\u0007T\u0002\u0002\u021e\u0220\u0005V,\u0002\u021f",
    "\u021d\u0003\u0002\u0002\u0002\u0220\u0223\u0003\u0002\u0002\u0002\u0221",
    "\u021f\u0003\u0002\u0002\u0002\u0221\u0222\u0003\u0002\u0002\u0002\u0222",
    "U\u0003\u0002\u0002\u0002\u0223\u0221\u0003\u0002\u0002\u0002\u0224",
    "\u0229\u0005X-\u0002\u0225\u0226\u0007S\u0002\u0002\u0226\u0228\u0005",
    "X-\u0002\u0227\u0225\u0003\u0002\u0002\u0002\u0228\u022b\u0003\u0002",
    "\u0002\u0002\u0229\u0227\u0003\u0002\u0002\u0002\u0229\u022a\u0003\u0002",
    "\u0002\u0002\u022aW\u0003\u0002\u0002\u0002\u022b\u0229\u0003\u0002",
    "\u0002\u0002\u022c\u0231\u0005Z.\u0002\u022d\u022e\u0007V\u0002\u0002",
    "\u022e\u0230\u0005Z.\u0002\u022f\u022d\u0003\u0002\u0002\u0002\u0230",
    "\u0233\u0003\u0002\u0002\u0002\u0231\u022f\u0003\u0002\u0002\u0002\u0231",
    "\u0232\u0003\u0002\u0002\u0002\u0232Y\u0003\u0002\u0002\u0002\u0233",
    "\u0231\u0003\u0002\u0002\u0002\u0234\u0239\u0005\\/\u0002\u0235\u0236",
    "\u0007R\u0002\u0002\u0236\u0238\u0005\\/\u0002\u0237\u0235\u0003\u0002",
    "\u0002\u0002\u0238\u023b\u0003\u0002\u0002\u0002\u0239\u0237\u0003\u0002",
    "\u0002\u0002\u0239\u023a\u0003\u0002\u0002\u0002\u023a[\u0003\u0002",
    "\u0002\u0002\u023b\u0239\u0003\u0002\u0002\u0002\u023c\u0241\u0005^",
    "0\u0002\u023d\u023e\t\n\u0002\u0002\u023e\u0240\u0005^0\u0002\u023f",
    "\u023d\u0003\u0002\u0002\u0002\u0240\u0243\u0003\u0002\u0002\u0002\u0241",
    "\u023f\u0003\u0002\u0002\u0002\u0241\u0242\u0003\u0002\u0002\u0002\u0242",
    "]\u0003\u0002\u0002\u0002\u0243\u0241\u0003\u0002\u0002\u0002\u0244",
    "\u0249\u0005`1\u0002\u0245\u0246\t\u000b\u0002\u0002\u0246\u0248\u0005",
    "`1\u0002\u0247\u0245\u0003\u0002\u0002\u0002\u0248\u024b\u0003\u0002",
    "\u0002\u0002\u0249\u0247\u0003\u0002\u0002\u0002\u0249\u024a\u0003\u0002",
    "\u0002\u0002\u024a_\u0003\u0002\u0002\u0002\u024b\u0249\u0003\u0002",
    "\u0002\u0002\u024c\u0251\u0005b2\u0002\u024d\u024e\t\f\u0002\u0002\u024e",
    "\u0250\u0005b2\u0002\u024f\u024d\u0003\u0002\u0002\u0002\u0250\u0253",
    "\u0003\u0002\u0002\u0002\u0251\u024f\u0003\u0002\u0002\u0002\u0251\u0252",
    "\u0003\u0002\u0002\u0002\u0252a\u0003\u0002\u0002\u0002\u0253\u0251",
    "\u0003\u0002\u0002\u0002\u0254\u0259\u0005d3\u0002\u0255\u0256\t\r\u0002",
    "\u0002\u0256\u0258\u0005d3\u0002\u0257\u0255\u0003\u0002\u0002\u0002",
    "\u0258\u025b\u0003\u0002\u0002\u0002\u0259\u0257\u0003\u0002\u0002\u0002",
    "\u0259\u025a\u0003\u0002\u0002\u0002\u025ac\u0003\u0002\u0002\u0002",
    "\u025b\u0259\u0003\u0002\u0002\u0002\u025c\u0261\u0005f4\u0002\u025d",
    "\u025e\t\u000e\u0002\u0002\u025e\u0260\u0005f4\u0002\u025f\u025d\u0003",
    "\u0002\u0002\u0002\u0260\u0263\u0003\u0002\u0002\u0002\u0261\u025f\u0003",
    "\u0002\u0002\u0002\u0261\u0262\u0003\u0002\u0002\u0002\u0262e\u0003",
    "\u0002\u0002\u0002\u0263\u0261\u0003\u0002\u0002\u0002\u0264\u0266\u0007",
    "\u0006\u0002\u0002\u0265\u0264\u0003\u0002\u0002\u0002\u0265\u0266\u0003",
    "\u0002\u0002\u0002\u0266\u0267\u0003\u0002\u0002\u0002\u0267\u0268\u0007",
    "?\u0002\u0002\u0268\u0269\u0005\u001e\u0010\u0002\u0269\u026a\u0007",
    "@\u0002\u0002\u026a\u026b\u0005f4\u0002\u026b\u026f\u0003\u0002\u0002",
    "\u0002\u026c\u026f\u0005h5\u0002\u026d\u026f\u0007n\u0002\u0002\u026e",
    "\u0265\u0003\u0002\u0002\u0002\u026e\u026c\u0003\u0002\u0002\u0002\u026e",
    "\u026d\u0003\u0002\u0002\u0002\u026fg\u0003\u0002\u0002\u0002\u0270",
    "\u0272\t\u000f\u0002\u0002\u0271\u0270\u0003\u0002\u0002\u0002\u0272",
    "\u0275\u0003\u0002\u0002\u0002\u0273\u0271\u0003\u0002\u0002\u0002\u0273",
    "\u0274\u0003\u0002\u0002\u0002\u0274\u0281\u0003\u0002\u0002\u0002\u0275",
    "\u0273\u0003\u0002\u0002\u0002\u0276\u0282\u0005j6\u0002\u0277\u0278",
    "\u0005v<\u0002\u0278\u0279\u0005f4\u0002\u0279\u0282\u0003\u0002\u0002",
    "\u0002\u027a\u027b\t\u0010\u0002\u0002\u027b\u027c\u0007?\u0002\u0002",
    "\u027c\u027d\u0005\u001e\u0010\u0002\u027d\u027e\u0007@\u0002\u0002",
    "\u027e\u0282\u0003\u0002\u0002\u0002\u027f\u0280\u0007T\u0002\u0002",
    "\u0280\u0282\u0007m\u0002\u0002\u0281\u0276\u0003\u0002\u0002\u0002",
    "\u0281\u0277\u0003\u0002\u0002\u0002\u0281\u027a\u0003\u0002\u0002\u0002",
    "\u0281\u027f\u0003\u0002\u0002\u0002\u0282i\u0003\u0002\u0002\u0002",
    "\u0283\u0292\u0005l7\u0002\u0284\u0286\u0007\u0006\u0002\u0002\u0285",
    "\u0284\u0003\u0002\u0002\u0002\u0285\u0286\u0003\u0002\u0002\u0002\u0286",
    "\u0287\u0003\u0002\u0002\u0002\u0287\u0288\u0007?\u0002\u0002\u0288",
    "\u0289\u0005\u001e\u0010\u0002\u0289\u028a\u0007@\u0002\u0002\u028a",
    "\u028b\u0007C\u0002\u0002\u028b\u028d\u0005\u008eH\u0002\u028c\u028e",
    "\u0007\\\u0002\u0002\u028d\u028c\u0003\u0002\u0002\u0002\u028d\u028e",
    "\u0003\u0002\u0002\u0002\u028e\u028f\u0003\u0002\u0002\u0002\u028f\u0290",
    "\u0007D\u0002\u0002\u0290\u0292\u0003\u0002\u0002\u0002\u0291\u0283",
    "\u0003\u0002\u0002\u0002\u0291\u0285\u0003\u0002\u0002\u0002\u0292\u02a1",
    "\u0003\u0002\u0002\u0002\u0293\u0294\u0007A\u0002\u0002\u0294\u0295",
    "\u0005\u00acW\u0002\u0295\u0296\u0007B\u0002\u0002\u0296\u02a0\u0003",
    "\u0002\u0002\u0002\u0297\u0299\u0007?\u0002\u0002\u0298\u029a\u0005",
    "t;\u0002\u0299\u0298\u0003\u0002\u0002\u0002\u0299\u029a\u0003\u0002",
    "\u0002\u0002\u029a\u029b\u0003\u0002\u0002\u0002\u029b\u02a0\u0007@",
    "\u0002\u0002\u029c\u029d\t\u0011\u0002\u0002\u029d\u02a0\u0007m\u0002",
    "\u0002\u029e\u02a0\t\u0012\u0002\u0002\u029f\u0293\u0003\u0002\u0002",
    "\u0002\u029f\u0297\u0003\u0002\u0002\u0002\u029f\u029c\u0003\u0002\u0002",
    "\u0002\u029f\u029e\u0003\u0002\u0002\u0002\u02a0\u02a3\u0003\u0002\u0002",
    "\u0002\u02a1\u029f\u0003\u0002\u0002\u0002\u02a1\u02a2\u0003\u0002\u0002",
    "\u0002\u02a2k\u0003\u0002\u0002\u0002\u02a3\u02a1\u0003\u0002\u0002",
    "\u0002\u02a4\u02c6\u0007m\u0002\u0002\u02a5\u02c6\u0007\u0011\u0002",
    "\u0002\u02a6\u02a8\u0007\u0012\u0002\u0002\u02a7\u02a6\u0003\u0002\u0002",
    "\u0002\u02a8\u02a9\u0003\u0002\u0002\u0002\u02a9\u02a7\u0003\u0002\u0002",
    "\u0002\u02a9\u02aa\u0003\u0002\u0002\u0002\u02aa\u02c6\u0003\u0002\u0002",
    "\u0002\u02ab\u02ac\u0007?\u0002\u0002\u02ac\u02ad\u0005\u00acW\u0002",
    "\u02ad\u02ae\u0007@\u0002\u0002\u02ae\u02c6\u0003\u0002\u0002\u0002",
    "\u02af\u02c6\u0005n8\u0002\u02b0\u02b2\u0007\u0006\u0002\u0002\u02b1",
    "\u02b0\u0003\u0002\u0002\u0002\u02b1\u02b2\u0003\u0002\u0002\u0002\u02b2",
    "\u02b3\u0003\u0002\u0002\u0002\u02b3\u02b4\u0007?\u0002\u0002\u02b4",
    "\u02b5\u0005\u009cO\u0002\u02b5\u02b6\u0007@\u0002\u0002\u02b6\u02c6",
    "\u0003\u0002\u0002\u0002\u02b7\u02b8\u0007\f\u0002\u0002\u02b8\u02b9",
    "\u0007?\u0002\u0002\u02b9\u02ba\u0005h5\u0002\u02ba\u02bb\u0007\\\u0002",
    "\u0002\u02bb\u02bc\u0005\u001e\u0010\u0002\u02bc\u02bd\u0007@\u0002",
    "\u0002\u02bd\u02c6\u0003\u0002\u0002\u0002\u02be\u02bf\u0007\r\u0002",
    "\u0002\u02bf\u02c0\u0007?\u0002\u0002\u02c0\u02c1\u0005\u001e\u0010",
    "\u0002\u02c1\u02c2\u0007\\\u0002\u0002\u02c2\u02c3\u0005h5\u0002\u02c3",
    "\u02c4\u0007@\u0002\u0002\u02c4\u02c6\u0003\u0002\u0002\u0002\u02c5",
    "\u02a4\u0003\u0002\u0002\u0002\u02c5\u02a5\u0003\u0002\u0002\u0002\u02c5",
    "\u02a7\u0003\u0002\u0002\u0002\u02c5\u02ab\u0003\u0002\u0002\u0002\u02c5",
    "\u02af\u0003\u0002\u0002\u0002\u02c5\u02b1\u0003\u0002\u0002\u0002\u02c5",
    "\u02b7\u0003\u0002\u0002\u0002\u02c5\u02be\u0003\u0002\u0002\u0002\u02c6",
    "m\u0003\u0002\u0002\u0002\u02c7\u02c8\u0007:\u0002\u0002\u02c8\u02c9",
    "\u0007?\u0002\u0002\u02c9\u02ca\u0005N(\u0002\u02ca\u02cb\u0007\\\u0002",
    "\u0002\u02cb\u02cc\u0005p9\u0002\u02cc\u02cd\u0007@\u0002\u0002\u02cd",
    "o\u0003\u0002\u0002\u0002\u02ce\u02d3\u0005r:\u0002\u02cf\u02d0\u0007",
    "\\\u0002\u0002\u02d0\u02d2\u0005r:\u0002\u02d1\u02cf\u0003\u0002\u0002",
    "\u0002\u02d2\u02d5\u0003\u0002\u0002\u0002\u02d3\u02d1\u0003\u0002\u0002",
    "\u0002\u02d3\u02d4\u0003\u0002\u0002\u0002\u02d4q\u0003\u0002\u0002",
    "\u0002\u02d5\u02d3\u0003\u0002\u0002\u0002\u02d6\u02d9\u0005\u001e\u0010",
    "\u0002\u02d7\u02d9\u0007\u0019\u0002\u0002\u02d8\u02d6\u0003\u0002\u0002",
    "\u0002\u02d8\u02d7\u0003\u0002\u0002\u0002\u02d9\u02da\u0003\u0002\u0002",
    "\u0002\u02da\u02db\u0007Z\u0002\u0002\u02db\u02dc\u0005N(\u0002\u02dc",
    "s\u0003\u0002\u0002\u0002\u02dd\u02e2\u0005N(\u0002\u02de\u02df\u0007",
    "\\\u0002\u0002\u02df\u02e1\u0005N(\u0002\u02e0\u02de\u0003\u0002\u0002",
    "\u0002\u02e1\u02e4\u0003\u0002\u0002\u0002\u02e2\u02e0\u0003\u0002\u0002",
    "\u0002\u02e2\u02e3\u0003\u0002\u0002\u0002\u02e3u\u0003\u0002\u0002",
    "\u0002\u02e4\u02e2\u0003\u0002\u0002\u0002\u02e5\u02e6\t\u0013\u0002",
    "\u0002\u02e6w\u0003\u0002\u0002\u0002\u02e7\u02e8\t\u0014\u0002\u0002",
    "\u02e8y\u0003\u0002\u0002\u0002\u02e9\u02ec\u0005|?\u0002\u02ea\u02eb",
    "\u0007\\\u0002\u0002\u02eb\u02ed\u0007l\u0002\u0002\u02ec\u02ea\u0003",
    "\u0002\u0002\u0002\u02ec\u02ed\u0003\u0002\u0002\u0002\u02ed{\u0003",
    "\u0002\u0002\u0002\u02ee\u02f3\u0005~@\u0002\u02ef\u02f0\u0007\\\u0002",
    "\u0002\u02f0\u02f2\u0005~@\u0002\u02f1\u02ef\u0003\u0002\u0002\u0002",
    "\u02f2\u02f5\u0003\u0002\u0002\u0002\u02f3\u02f1\u0003\u0002\u0002\u0002",
    "\u02f3\u02f4\u0003\u0002\u0002\u0002\u02f4}\u0003\u0002\u0002\u0002",
    "\u02f5\u02f3\u0003\u0002\u0002\u0002\u02f6\u02f7\u0005\u000e\b\u0002",
    "\u02f7\u02f8\u0005H%\u0002\u02f8\u02fe\u0003\u0002\u0002\u0002\u02f9",
    "\u02fb\u0005\u0080A\u0002\u02fa\u02fc\u0005\u0082B\u0002\u02fb\u02fa",
    "\u0003\u0002\u0002\u0002\u02fb\u02fc\u0003\u0002\u0002\u0002\u02fc\u02fe",
    "\u0003\u0002\u0002\u0002\u02fd\u02f6\u0003\u0002\u0002\u0002\u02fd\u02f9",
    "\u0003\u0002\u0002\u0002\u02fe\u007f\u0003\u0002\u0002\u0002\u02ff\u0301",
    "\u0005\u0016\f\u0002\u0300\u02ff\u0003\u0002\u0002\u0002\u0301\u0302",
    "\u0003\u0002\u0002\u0002\u0302\u0300\u0003\u0002\u0002\u0002\u0302\u0303",
    "\u0003\u0002\u0002\u0002\u0303\u0081\u0003\u0002\u0002\u0002\u0304\u0310",
    "\u0005:\u001e\u0002\u0305\u0307\u0005:\u001e\u0002\u0306\u0305\u0003",
    "\u0002\u0002\u0002\u0306\u0307\u0003\u0002\u0002\u0002\u0307\u0308\u0003",
    "\u0002\u0002\u0002\u0308\u030c\u0005\u0084C\u0002\u0309\u030b\u0005",
    "\u0086D\u0002\u030a\u0309\u0003\u0002\u0002\u0002\u030b\u030e\u0003",
    "\u0002\u0002\u0002\u030c\u030a\u0003\u0002\u0002\u0002\u030c\u030d\u0003",
    "\u0002\u0002\u0002\u030d\u0310\u0003\u0002\u0002\u0002\u030e\u030c\u0003",
    "\u0002\u0002\u0002\u030f\u0304\u0003\u0002\u0002\u0002\u030f\u0306\u0003",
    "\u0002\u0002\u0002\u0310\u0083\u0003\u0002\u0002\u0002\u0311\u0312\b",
    "C\u0001\u0002\u0312\u0313\u0007?\u0002\u0002\u0313\u0314\u0005\u0082",
    "B\u0002\u0314\u0318\u0007@\u0002\u0002\u0315\u0317\u0005\u0086D\u0002",
    "\u0316\u0315\u0003\u0002\u0002\u0002\u0317\u031a\u0003\u0002\u0002\u0002",
    "\u0318\u0316\u0003\u0002\u0002\u0002\u0318\u0319\u0003\u0002\u0002\u0002",
    "\u0319\u0340\u0003\u0002\u0002\u0002\u031a\u0318\u0003\u0002\u0002\u0002",
    "\u031b\u031d\u0007A\u0002\u0002\u031c\u031e\u0005L\'\u0002\u031d\u031c",
    "\u0003\u0002\u0002\u0002\u031d\u031e\u0003\u0002\u0002\u0002\u031e\u0320",
    "\u0003\u0002\u0002\u0002\u031f\u0321\u0005N(\u0002\u0320\u031f\u0003",
    "\u0002\u0002\u0002\u0320\u0321\u0003\u0002\u0002\u0002\u0321\u0322\u0003",
    "\u0002\u0002\u0002\u0322\u0340\u0007B\u0002\u0002\u0323\u0324\u0007",
    "A\u0002\u0002\u0324\u0326\u0007,\u0002\u0002\u0325\u0327\u0005L\'\u0002",
    "\u0326\u0325\u0003\u0002\u0002\u0002\u0326\u0327\u0003\u0002\u0002\u0002",
    "\u0327\u0328\u0003\u0002\u0002\u0002\u0328\u0329\u0005N(\u0002\u0329",
    "\u032a\u0007B\u0002\u0002\u032a\u0340\u0003\u0002\u0002\u0002\u032b",
    "\u032c\u0007A\u0002\u0002\u032c\u032d\u0005L\'\u0002\u032d\u032e\u0007",
    ",\u0002\u0002\u032e\u032f\u0005N(\u0002\u032f\u0330\u0007B\u0002\u0002",
    "\u0330\u0340\u0003\u0002\u0002\u0002\u0331\u0332\u0007A\u0002\u0002",
    "\u0332\u0333\u0007O\u0002\u0002\u0333\u0340\u0007B\u0002\u0002\u0334",
    "\u0336\u0007?\u0002\u0002\u0335\u0337\u0005z>\u0002\u0336\u0335\u0003",
    "\u0002\u0002\u0002\u0336\u0337\u0003\u0002\u0002\u0002\u0337\u0338\u0003",
    "\u0002\u0002\u0002\u0338\u033c\u0007@\u0002\u0002\u0339\u033b\u0005",
    "\u0086D\u0002\u033a\u0339\u0003\u0002\u0002\u0002\u033b\u033e\u0003",
    "\u0002\u0002\u0002\u033c\u033a\u0003\u0002\u0002\u0002\u033c\u033d\u0003",
    "\u0002\u0002\u0002\u033d\u0340\u0003\u0002\u0002\u0002\u033e\u033c\u0003",
    "\u0002\u0002\u0002\u033f\u0311\u0003\u0002\u0002\u0002\u033f\u031b\u0003",
    "\u0002\u0002\u0002\u033f\u0323\u0003\u0002\u0002\u0002\u033f\u032b\u0003",
    "\u0002\u0002\u0002\u033f\u0331\u0003\u0002\u0002\u0002\u033f\u0334\u0003",
    "\u0002\u0002\u0002\u0340\u036c\u0003\u0002\u0002\u0002\u0341\u0342\f",
    "\u0007\u0002\u0002\u0342\u0344\u0007A\u0002\u0002\u0343\u0345\u0005",
    "L\'\u0002\u0344\u0343\u0003\u0002\u0002\u0002\u0344\u0345\u0003\u0002",
    "\u0002\u0002\u0345\u0347\u0003\u0002\u0002\u0002\u0346\u0348\u0005N",
    "(\u0002\u0347\u0346\u0003\u0002\u0002\u0002\u0347\u0348\u0003\u0002",
    "\u0002\u0002\u0348\u0349\u0003\u0002\u0002\u0002\u0349\u036b\u0007B",
    "\u0002\u0002\u034a\u034b\f\u0006\u0002\u0002\u034b\u034c\u0007A\u0002",
    "\u0002\u034c\u034e\u0007,\u0002\u0002\u034d\u034f\u0005L\'\u0002\u034e",
    "\u034d\u0003\u0002\u0002\u0002\u034e\u034f\u0003\u0002\u0002\u0002\u034f",
    "\u0350\u0003\u0002\u0002\u0002\u0350\u0351\u0005N(\u0002\u0351\u0352",
    "\u0007B\u0002\u0002\u0352\u036b\u0003\u0002\u0002\u0002\u0353\u0354",
    "\f\u0005\u0002\u0002\u0354\u0355\u0007A\u0002\u0002\u0355\u0356\u0005",
    "L\'\u0002\u0356\u0357\u0007,\u0002\u0002\u0357\u0358\u0005N(\u0002\u0358",
    "\u0359\u0007B\u0002\u0002\u0359\u036b\u0003\u0002\u0002\u0002\u035a",
    "\u035b\f\u0004\u0002\u0002\u035b\u035c\u0007A\u0002\u0002\u035c\u035d",
    "\u0007O\u0002\u0002\u035d\u036b\u0007B\u0002\u0002\u035e\u035f\f\u0003",
    "\u0002\u0002\u035f\u0361\u0007?\u0002\u0002\u0360\u0362\u0005z>\u0002",
    "\u0361\u0360\u0003\u0002\u0002\u0002\u0361\u0362\u0003\u0002\u0002\u0002",
    "\u0362\u0363\u0003\u0002\u0002\u0002\u0363\u0367\u0007@\u0002\u0002",
    "\u0364\u0366\u0005\u0086D\u0002\u0365\u0364\u0003\u0002\u0002\u0002",
    "\u0366\u0369\u0003\u0002\u0002\u0002\u0367\u0365\u0003\u0002\u0002\u0002",
    "\u0367\u0368\u0003\u0002\u0002\u0002\u0368\u036b\u0003\u0002\u0002\u0002",
    "\u0369\u0367\u0003\u0002\u0002\u0002\u036a\u0341\u0003\u0002\u0002\u0002",
    "\u036a\u034a\u0003\u0002\u0002\u0002\u036a\u0353\u0003\u0002\u0002\u0002",
    "\u036a\u035a\u0003\u0002\u0002\u0002\u036a\u035e\u0003\u0002\u0002\u0002",
    "\u036b\u036e\u0003\u0002\u0002\u0002\u036c\u036a\u0003\u0002\u0002\u0002",
    "\u036c\u036d\u0003\u0002\u0002\u0002\u036d\u0085\u0003\u0002\u0002\u0002",
    "\u036e\u036c\u0003\u0002\u0002\u0002\u036f\u0370\u0007\u000e\u0002\u0002",
    "\u0370\u0372\u0007?\u0002\u0002\u0371\u0373\u0007\u0012\u0002\u0002",
    "\u0372\u0371\u0003\u0002\u0002\u0002\u0373\u0374\u0003\u0002\u0002\u0002",
    "\u0374\u0372\u0003\u0002\u0002\u0002\u0374\u0375\u0003\u0002\u0002\u0002",
    "\u0375\u0376\u0003\u0002\u0002\u0002\u0376\u0379\u0007@\u0002\u0002",
    "\u0377\u0379\u0005@!\u0002\u0378\u036f\u0003\u0002\u0002\u0002\u0378",
    "\u0377\u0003\u0002\u0002\u0002\u0379\u0087\u0003\u0002\u0002\u0002\u037a",
    "\u037b\u0007m\u0002\u0002\u037b\u0089\u0003\u0002\u0002\u0002\u037c",
    "\u0381\u0007m\u0002\u0002\u037d\u037e\u0007\\\u0002\u0002\u037e\u0380",
    "\u0007m\u0002\u0002\u037f\u037d\u0003\u0002\u0002\u0002\u0380\u0383",
    "\u0003\u0002\u0002\u0002\u0381\u037f\u0003\u0002\u0002\u0002\u0381\u0382",
    "\u0003\u0002\u0002\u0002\u0382\u008b\u0003\u0002\u0002\u0002\u0383\u0381",
    "\u0003\u0002\u0002\u0002\u0384\u038d\u0005N(\u0002\u0385\u0386\u0007",
    "C\u0002\u0002\u0386\u0388\u0005\u008eH\u0002\u0387\u0389\u0007\\\u0002",
    "\u0002\u0388\u0387\u0003\u0002\u0002\u0002\u0388\u0389\u0003\u0002\u0002",
    "\u0002\u0389\u038a\u0003\u0002\u0002\u0002\u038a\u038b\u0007D\u0002",
    "\u0002\u038b\u038d\u0003\u0002\u0002\u0002\u038c\u0384\u0003\u0002\u0002",
    "\u0002\u038c\u0385\u0003\u0002\u0002\u0002\u038d\u008d\u0003\u0002\u0002",
    "\u0002\u038e\u0390\u0005\u0090I\u0002\u038f\u038e\u0003\u0002\u0002",
    "\u0002\u038f\u0390\u0003\u0002\u0002\u0002\u0390\u0391\u0003\u0002\u0002",
    "\u0002\u0391\u0399\u0005\u008cG\u0002\u0392\u0394\u0007\\\u0002\u0002",
    "\u0393\u0395\u0005\u0090I\u0002\u0394\u0393\u0003\u0002\u0002\u0002",
    "\u0394\u0395\u0003\u0002\u0002\u0002\u0395\u0396\u0003\u0002\u0002\u0002",
    "\u0396\u0398\u0005\u008cG\u0002\u0397\u0392\u0003\u0002\u0002\u0002",
    "\u0398\u039b\u0003\u0002\u0002\u0002\u0399\u0397\u0003\u0002\u0002\u0002",
    "\u0399\u039a\u0003\u0002\u0002\u0002\u039a\u008f\u0003\u0002\u0002\u0002",
    "\u039b\u0399\u0003\u0002\u0002\u0002\u039c\u039d\u0005\u0092J\u0002",
    "\u039d\u039e\u0007]\u0002\u0002\u039e\u0091\u0003\u0002\u0002\u0002",
    "\u039f\u03a1\u0005\u0094K\u0002\u03a0\u039f\u0003\u0002\u0002\u0002",
    "\u03a1\u03a2\u0003\u0002\u0002\u0002\u03a2\u03a0\u0003\u0002\u0002\u0002",
    "\u03a2\u03a3\u0003\u0002\u0002\u0002\u03a3\u0093\u0003\u0002\u0002\u0002",
    "\u03a4\u03a5\u0007A\u0002\u0002\u03a5\u03a6\u00058\u001d\u0002\u03a6",
    "\u03a7\u0007B\u0002\u0002\u03a7\u03ab\u0003\u0002\u0002\u0002\u03a8",
    "\u03a9\u0007k\u0002\u0002\u03a9\u03ab\u0007m\u0002\u0002\u03aa\u03a4",
    "\u0003\u0002\u0002\u0002\u03aa\u03a8\u0003\u0002\u0002\u0002\u03ab\u0095",
    "\u0003\u0002\u0002\u0002\u03ac\u03d2\u0005\u009aN\u0002\u03ad\u03d2",
    "\u0005\u009cO\u0002\u03ae\u03d2\u0005\u009eP\u0002\u03af\u03d2\u0005",
    "\u00a0Q\u0002\u03b0\u03d2\u0005\u00a2R\u0002\u03b1\u03d2\u0005\u00aa",
    "V\u0002\u03b2\u03b3\t\u0015\u0002\u0002\u03b3\u03b4\t\u0016\u0002\u0002",
    "\u03b4\u03bd\u0007?\u0002\u0002\u03b5\u03ba\u0005R*\u0002\u03b6\u03b7",
    "\u0007\\\u0002\u0002\u03b7\u03b9\u0005R*\u0002\u03b8\u03b6\u0003\u0002",
    "\u0002\u0002\u03b9\u03bc\u0003\u0002\u0002\u0002\u03ba\u03b8\u0003\u0002",
    "\u0002\u0002\u03ba\u03bb\u0003\u0002\u0002\u0002\u03bb\u03be\u0003\u0002",
    "\u0002\u0002\u03bc\u03ba\u0003\u0002\u0002\u0002\u03bd\u03b5\u0003\u0002",
    "\u0002\u0002\u03bd\u03be\u0003\u0002\u0002\u0002\u03be\u03cc\u0003\u0002",
    "\u0002\u0002\u03bf\u03c8\u0007Z\u0002\u0002\u03c0\u03c5\u0005R*\u0002",
    "\u03c1\u03c2\u0007\\\u0002\u0002\u03c2\u03c4\u0005R*\u0002\u03c3\u03c1",
    "\u0003\u0002\u0002\u0002\u03c4\u03c7\u0003\u0002\u0002\u0002\u03c5\u03c3",
    "\u0003\u0002\u0002\u0002\u03c5\u03c6\u0003\u0002\u0002\u0002\u03c6\u03c9",
    "\u0003\u0002\u0002\u0002\u03c7\u03c5\u0003\u0002\u0002\u0002\u03c8\u03c0",
    "\u0003\u0002\u0002\u0002\u03c8\u03c9\u0003\u0002\u0002\u0002\u03c9\u03cb",
    "\u0003\u0002\u0002\u0002\u03ca\u03bf\u0003\u0002\u0002\u0002\u03cb\u03ce",
    "\u0003\u0002\u0002\u0002\u03cc\u03ca\u0003\u0002\u0002\u0002\u03cc\u03cd",
    "\u0003\u0002\u0002\u0002\u03cd\u03cf\u0003\u0002\u0002\u0002\u03ce\u03cc",
    "\u0003\u0002\u0002\u0002\u03cf\u03d0\u0007@\u0002\u0002\u03d0\u03d2",
    "\u0007[\u0002\u0002\u03d1\u03ac\u0003\u0002\u0002\u0002\u03d1\u03ad",
    "\u0003\u0002\u0002\u0002\u03d1\u03ae\u0003\u0002\u0002\u0002\u03d1\u03af",
    "\u0003\u0002\u0002\u0002\u03d1\u03b0\u0003\u0002\u0002\u0002\u03d1\u03b1",
    "\u0003\u0002\u0002\u0002\u03d1\u03b2\u0003\u0002\u0002\u0002\u03d2\u0097",
    "\u0003\u0002\u0002\u0002\u03d3\u03d9\n\u0017\u0002\u0002\u03d4\u03d5",
    "\u0007?\u0002\u0002\u03d5\u03d6\u0005\u0098M\u0002\u03d6\u03d7\u0007",
    "@\u0002\u0002\u03d7\u03d9\u0003\u0002\u0002\u0002\u03d8\u03d3\u0003",
    "\u0002\u0002\u0002\u03d8\u03d4\u0003\u0002\u0002\u0002\u03d9\u03dc\u0003",
    "\u0002\u0002\u0002\u03da\u03d8\u0003\u0002\u0002\u0002\u03da\u03db\u0003",
    "\u0002\u0002\u0002\u03db\u0099\u0003\u0002\u0002\u0002\u03dc\u03da\u0003",
    "\u0002\u0002\u0002\u03dd\u03de\u0007m\u0002\u0002\u03de\u03df\u0007",
    "Z\u0002\u0002\u03df\u03e9\u0005\u0096L\u0002\u03e0\u03e1\u0007\u0015",
    "\u0002\u0002\u03e1\u03e2\u00058\u001d\u0002\u03e2\u03e3\u0007Z\u0002",
    "\u0002\u03e3\u03e4\u0005\u0096L\u0002\u03e4\u03e9\u0003\u0002\u0002",
    "\u0002\u03e5\u03e6\u0007\u0019\u0002\u0002\u03e6\u03e7\u0007Z\u0002",
    "\u0002\u03e7\u03e9\u0005\u0096L\u0002\u03e8\u03dd\u0003\u0002\u0002",
    "\u0002\u03e8\u03e0\u0003\u0002\u0002\u0002\u03e8\u03e5\u0003\u0002\u0002",
    "\u0002\u03e9\u009b\u0003\u0002\u0002\u0002\u03ea\u03ec\u0007C\u0002",
    "\u0002\u03eb\u03ed\u0005\u00aeX\u0002\u03ec\u03eb\u0003\u0002\u0002",
    "\u0002\u03ec\u03ed\u0003\u0002\u0002\u0002\u03ed\u03ee\u0003\u0002\u0002",
    "\u0002\u03ee\u03ef\u0007D\u0002\u0002\u03ef\u009d\u0003\u0002\u0002",
    "\u0002\u03f0\u03f2\u0005\u00acW\u0002\u03f1\u03f0\u0003\u0002\u0002",
    "\u0002\u03f1\u03f2\u0003\u0002\u0002\u0002\u03f2\u03f3\u0003\u0002\u0002",
    "\u0002\u03f3\u03f4\u0007[\u0002\u0002\u03f4\u009f\u0003\u0002\u0002",
    "\u0002\u03f5\u03f6\u0007\"\u0002\u0002\u03f6\u03f7\u0007?\u0002\u0002",
    "\u03f7\u03f8\u0005\u00acW\u0002\u03f8\u03f9\u0007@\u0002\u0002\u03f9",
    "\u03fc\u0005\u0096L\u0002\u03fa\u03fb\u0007\u001c\u0002\u0002\u03fb",
    "\u03fd\u0005\u0096L\u0002\u03fc\u03fa\u0003\u0002\u0002\u0002\u03fc",
    "\u03fd\u0003\u0002\u0002\u0002\u03fd\u0405\u0003\u0002\u0002\u0002\u03fe",
    "\u03ff\u0007.\u0002\u0002\u03ff\u0400\u0007?\u0002\u0002\u0400\u0401",
    "\u0005\u00acW\u0002\u0401\u0402\u0007@\u0002\u0002\u0402\u0403\u0005",
    "\u0096L\u0002\u0403\u0405\u0003\u0002\u0002\u0002\u0404\u03f5\u0003",
    "\u0002\u0002\u0002\u0404\u03fe\u0003\u0002\u0002\u0002\u0405\u00a1\u0003",
    "\u0002\u0002\u0002\u0406\u0407\u00074\u0002\u0002\u0407\u0408\u0007",
    "?\u0002\u0002\u0408\u0409\u0005\u00acW\u0002\u0409\u040a\u0007@\u0002",
    "\u0002\u040a\u040b\u0005\u0096L\u0002\u040b\u041b\u0003\u0002\u0002",
    "\u0002\u040c\u040d\u0007\u001a\u0002\u0002\u040d\u040e\u0005\u0096L",
    "\u0002\u040e\u040f\u00074\u0002\u0002\u040f\u0410\u0007?\u0002\u0002",
    "\u0410\u0411\u0005\u00acW\u0002\u0411\u0412\u0007@\u0002\u0002\u0412",
    "\u0413\u0007[\u0002\u0002\u0413\u041b\u0003\u0002\u0002\u0002\u0414",
    "\u0415\u0007 \u0002\u0002\u0415\u0416\u0007?\u0002\u0002\u0416\u0417",
    "\u0005\u00a4S\u0002\u0417\u0418\u0007@\u0002\u0002\u0418\u0419\u0005",
    "\u0096L\u0002\u0419\u041b\u0003\u0002\u0002\u0002\u041a\u0406\u0003",
    "\u0002\u0002\u0002\u041a\u040c\u0003\u0002\u0002\u0002\u041a\u0414\u0003",
    "\u0002\u0002\u0002\u041b\u00a3\u0003\u0002\u0002\u0002\u041c\u0421\u0005",
    "\u00a6T\u0002\u041d\u041f\u0005\u00acW\u0002\u041e\u041d\u0003\u0002",
    "\u0002\u0002\u041e\u041f\u0003\u0002\u0002\u0002\u041f\u0421\u0003\u0002",
    "\u0002\u0002\u0420\u041c\u0003\u0002\u0002\u0002\u0420\u041e\u0003\u0002",
    "\u0002\u0002\u0421\u0422\u0003\u0002\u0002\u0002\u0422\u0424\u0007[",
    "\u0002\u0002\u0423\u0425\u0005\u00a8U\u0002\u0424\u0423\u0003\u0002",
    "\u0002\u0002\u0424\u0425\u0003\u0002\u0002\u0002\u0425\u0426\u0003\u0002",
    "\u0002\u0002\u0426\u0428\u0007[\u0002\u0002\u0427\u0429\u0005\u00a8",
    "U\u0002\u0428\u0427\u0003\u0002\u0002\u0002\u0428\u0429\u0003\u0002",
    "\u0002\u0002\u0429\u00a5\u0003\u0002\u0002\u0002\u042a\u042c\u0005\u000e",
    "\b\u0002\u042b\u042d\u0005\u0010\t\u0002\u042c\u042b\u0003\u0002\u0002",
    "\u0002\u042c\u042d\u0003\u0002\u0002\u0002\u042d\u00a7\u0003\u0002\u0002",
    "\u0002\u042e\u0433\u0005N(\u0002\u042f\u0430\u0007\\\u0002\u0002\u0430",
    "\u0432\u0005N(\u0002\u0431\u042f\u0003\u0002\u0002\u0002\u0432\u0435",
    "\u0003\u0002\u0002\u0002\u0433\u0431\u0003\u0002\u0002\u0002\u0433\u0434",
    "\u0003\u0002\u0002\u0002\u0434\u00a9\u0003\u0002\u0002\u0002\u0435\u0433",
    "\u0003\u0002\u0002\u0002\u0436\u0437\u0007!\u0002\u0002\u0437\u0440",
    "\u0007m\u0002\u0002\u0438\u0440\t\u0018\u0002\u0002\u0439\u043b\u0007",
    "(\u0002\u0002\u043a\u043c\u0005\u00acW\u0002\u043b\u043a\u0003\u0002",
    "\u0002\u0002\u043b\u043c\u0003\u0002\u0002\u0002\u043c\u0440\u0003\u0002",
    "\u0002\u0002\u043d\u043e\u0007!\u0002\u0002\u043e\u0440\u0005h5\u0002",
    "\u043f\u0436\u0003\u0002\u0002\u0002\u043f\u0438\u0003\u0002\u0002\u0002",
    "\u043f\u0439\u0003\u0002\u0002\u0002\u043f\u043d\u0003\u0002\u0002\u0002",
    "\u0440\u0441\u0003\u0002\u0002\u0002\u0441\u0442\u0007[\u0002\u0002",
    "\u0442\u00ab\u0003\u0002\u0002\u0002\u0443\u0448\u0005N(\u0002\u0444",
    "\u0445\u0007\\\u0002\u0002\u0445\u0447\u0005N(\u0002\u0446\u0444\u0003",
    "\u0002\u0002\u0002\u0447\u044a\u0003\u0002\u0002\u0002\u0448\u0446\u0003",
    "\u0002\u0002\u0002\u0448\u0449\u0003\u0002\u0002\u0002\u0449\u00ad\u0003",
    "\u0002\u0002\u0002\u044a\u0448\u0003\u0002\u0002\u0002\u044b\u044d\u0005",
    "\u00b0Y\u0002\u044c\u044b\u0003\u0002\u0002\u0002\u044d\u044e\u0003",
    "\u0002\u0002\u0002\u044e\u044c\u0003\u0002\u0002\u0002\u044e\u044f\u0003",
    "\u0002\u0002\u0002\u044f\u00af\u0003\u0002\u0002\u0002\u0450\u0453\u0005",
    "\u0096L\u0002\u0451\u0453\u0005\f\u0007\u0002\u0452\u0450\u0003\u0002",
    "\u0002\u0002\u0452\u0451\u0003\u0002\u0002\u0002\u0453\u00b1\u0003\u0002",
    "\u0002\u0002\u008d\u00b3\u00b9\u00bb\u00c1\u00c4\u00c8\u00cf\u00d3\u00d8",
    "\u00dd\u00e4\u00ea\u00f3\u00fc\u010f\u0115\u011f\u0123\u012c\u0133\u0137",
    "\u013c\u0140\u0143\u014a\u014f\u0153\u0157\u015c\u0162\u0169\u016f\u0179",
    "\u017d\u0187\u0191\u0195\u0199\u019f\u01a2\u01a8\u01ad\u01b3\u01b9\u01c7",
    "\u01cd\u01d2\u01d5\u01dc\u01eb\u01f7\u01fa\u01fc\u0202\u020a\u0212\u0219",
    "\u0221\u0229\u0231\u0239\u0241\u0249\u0251\u0259\u0261\u0265\u026e\u0273",
    "\u0281\u0285\u028d\u0291\u0299\u029f\u02a1\u02a9\u02b1\u02c5\u02d3\u02d8",
    "\u02e2\u02ec\u02f3\u02fb\u02fd\u0302\u0306\u030c\u030f\u0318\u031d\u0320",
    "\u0326\u0336\u033c\u033f\u0344\u0347\u034e\u0361\u0367\u036a\u036c\u0374",
    "\u0378\u0381\u0388\u038c\u038f\u0394\u0399\u03a2\u03aa\u03ba\u03bd\u03c5",
    "\u03c8\u03cc\u03d1\u03d8\u03da\u03e8\u03ec\u03f1\u03fc\u0404\u041a\u041e",
    "\u0420\u0424\u0428\u042c\u0433\u043b\u043f\u0448\u044e\u0452"].join("");


const atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN);

const decisionsToDFA = atn.decisionToState.map( (ds, index) => new antlr4.dfa.DFA(ds, index) );

const sharedContextCache = new antlr4.PredictionContextCache();

export default class CParser extends antlr4.Parser {

    static grammarFileName = "C.g4";
    static literalNames = [ null, "'__m128'", "'__m128d'", "'__m128i'", 
                            "'__extension__'", "'__typeof__'", "'__inline__'", 
                            "'__stdcall'", "'__declspec'", "'__attribute__'", 
                            "'__builtin_va_arg'", "'__builtin_offsetof'", 
                            "'__asm'", "'__asm__'", "'__volatile__'", null, 
                            null, "'auto'", "'break'", "'case'", "'char'", 
                            "'const'", "'continue'", "'default'", "'do'", 
                            "'double'", "'else'", "'enum'", "'extern'", 
                            "'float'", "'for'", "'goto'", "'if'", "'inline'", 
                            "'int'", "'long'", "'register'", "'restrict'", 
                            "'return'", "'short'", "'signed'", "'sizeof'", 
                            "'static'", "'struct'", "'switch'", "'typedef'", 
                            "'union'", "'unsigned'", "'void'", "'volatile'", 
                            "'while'", "'_Alignas'", "'_Alignof'", "'_Atomic'", 
                            "'_Bool'", "'_Complex'", "'_Generic'", "'_Imaginary'", 
                            "'_Noreturn'", "'_Static_assert'", "'_Thread_local'", 
                            "'('", "')'", "'['", "']'", "'{'", "'}'", "'<'", 
                            "'<='", "'>'", "'>='", "'<<'", "'>>'", "'+'", 
                            "'++'", "'-'", "'--'", "'*'", "'/'", "'%'", 
                            "'&'", "'|'", "'&&'", "'||'", "'^'", "'!'", 
                            "'~'", "'?'", "':'", "';'", "','", "'='", "'*='", 
                            "'/='", "'%='", "'+='", "'-='", "'<<='", "'>>='", 
                            "'&='", "'^='", "'|='", "'=='", "'!='", "'->'", 
                            "'.'", "'...'" ];
    static symbolicNames = [ null, null, null, null, null, null, null, null, 
                             null, null, null, null, null, null, null, "Constant", 
                             "StringLiteral", "Auto", "Break", "Case", "Char", 
                             "Const", "Continue", "Default", "Do", "Double", 
                             "Else", "Enum", "Extern", "Float", "For", "Goto", 
                             "If", "Inline", "Int", "Long", "Register", 
                             "Restrict", "Return", "Short", "Signed", "Sizeof", 
                             "Static", "Struct", "Switch", "Typedef", "Union", 
                             "Unsigned", "Void", "Volatile", "While", "Alignas", 
                             "Alignof", "Atomic", "Bool", "Complex", "Generic", 
                             "Imaginary", "Noreturn", "StaticAssert", "ThreadLocal", 
                             "LeftParen", "RightParen", "LeftBracket", "RightBracket", 
                             "LeftBrace", "RightBrace", "Less", "LessEqual", 
                             "Greater", "GreaterEqual", "LeftShift", "RightShift", 
                             "Plus", "PlusPlus", "Minus", "MinusMinus", 
                             "Star", "Div", "Mod", "And", "Or", "AndAnd", 
                             "OrOr", "Caret", "Not", "Tilde", "Question", 
                             "Colon", "Semi", "Comma", "Assign", "StarAssign", 
                             "DivAssign", "ModAssign", "PlusAssign", "MinusAssign", 
                             "LeftShiftAssign", "RightShiftAssign", "AndAssign", 
                             "XorAssign", "OrAssign", "Equal", "NotEqual", 
                             "Arrow", "Dot", "Ellipsis", "Identifier", "DigitSequence", 
                             "IfDefine", "IfNDefine", "EndIfDefine", "AsmBlock", 
                             "LineAfterPreprocessing", "LineDirective", 
                             "PragmaDirective", "ComplexDefine", "IncludeDirective", 
                             "Whitespace", "Newline", "BlockComment", "LineComment" ];
    static ruleNames = [ "compilationUnit", "translationUnit", "externalDeclaration", 
                         "functionDefinition", "declarationList", "declaration", 
                         "declarationSpecifiers", "initDeclaratorList", 
                         "initDeclarator", "staticAssertDeclaration", "declarationSpecifier", 
                         "storageClassSpecifier", "typeSpecifier", "atomicTypeSpecifier", 
                         "typeName", "structOrUnionSpecifier", "structOrUnion", 
                         "structDeclarationList", "structDeclaration", "specifierQualifierList", 
                         "structDeclaratorList", "structDeclarator", "enumSpecifier", 
                         "enumeratorList", "enumerator", "enumerationConstant", 
                         "typedefName", "constantExpression", "pointer", 
                         "typeQualifier", "functionSpecifier", "gccAttributeSpecifier", 
                         "gccAttributeList", "gccAttribute", "alignmentSpecifier", 
                         "declarator", "directDeclarator", "typeQualifierList", 
                         "assignmentExpression", "conditionalExpression", 
                         "logicalOrExpression", "logicalAndExpression", 
                         "inclusiveOrExpression", "exclusiveOrExpression", 
                         "andExpression", "equalityExpression", "relationalExpression", 
                         "shiftExpression", "additiveExpression", "multiplicativeExpression", 
                         "castExpression", "unaryExpression", "postfixExpression", 
                         "primaryExpression", "genericSelection", "genericAssocList", 
                         "genericAssociation", "argumentExpressionList", 
                         "unaryOperator", "assignmentOperator", "parameterTypeList", 
                         "parameterList", "parameterDeclaration", "declarationSpecifiers2", 
                         "abstractDeclarator", "directAbstractDeclarator", 
                         "gccDeclaratorExtension", "idName", "identifierList", 
                         "initializer", "initializerList", "designation", 
                         "designatorList", "designator", "statement", "nestedParenthesesBlock", 
                         "labeledStatement", "compoundStatement", "expressionStatement", 
                         "selectionStatement", "iterationStatement", "forCondition", 
                         "forDeclaration", "forExpression", "jumpStatement", 
                         "expression", "blockItemList", "blockItem" ];

    constructor(input) {
        super(input);
        this._interp = new antlr4.atn.ParserATNSimulator(this, atn, decisionsToDFA, sharedContextCache);
        this.ruleNames = CParser.ruleNames;
        this.literalNames = CParser.literalNames;
        this.symbolicNames = CParser.symbolicNames;
    }

    get atn() {
        return atn;
    }

    sempred(localctx, ruleIndex, predIndex) {
    	switch(ruleIndex) {
    	case 12:
    	    		return this.typeSpecifier_sempred(localctx, predIndex);
    	case 36:
    	    		return this.directDeclarator_sempred(localctx, predIndex);
    	case 65:
    	    		return this.directAbstractDeclarator_sempred(localctx, predIndex);
        default:
            throw "No predicate with index:" + ruleIndex;
       }
    }

    typeSpecifier_sempred(localctx, predIndex) {
    	switch(predIndex) {
    		case 0:
    			return this.precpred(this._ctx, 1);
    		default:
    			throw "No predicate with index:" + predIndex;
    	}
    };

    directDeclarator_sempred(localctx, predIndex) {
    	switch(predIndex) {
    		case 1:
    			return this.precpred(this._ctx, 8);
    		case 2:
    			return this.precpred(this._ctx, 7);
    		case 3:
    			return this.precpred(this._ctx, 6);
    		case 4:
    			return this.precpred(this._ctx, 5);
    		case 5:
    			return this.precpred(this._ctx, 4);
    		case 6:
    			return this.precpred(this._ctx, 3);
    		default:
    			throw "No predicate with index:" + predIndex;
    	}
    };

    directAbstractDeclarator_sempred(localctx, predIndex) {
    	switch(predIndex) {
    		case 7:
    			return this.precpred(this._ctx, 5);
    		case 8:
    			return this.precpred(this._ctx, 4);
    		case 9:
    			return this.precpred(this._ctx, 3);
    		case 10:
    			return this.precpred(this._ctx, 2);
    		case 11:
    			return this.precpred(this._ctx, 1);
    		default:
    			throw "No predicate with index:" + predIndex;
    	}
    };




	compilationUnit() {
	    let localctx = new CompilationUnitContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 0, CParser.RULE_compilationUnit);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 177;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 33)) & ~0x1f) == 0 && ((1 << (_la - 33)) & ((1 << (CParser.Inline - 33)) | (1 << (CParser.Int - 33)) | (1 << (CParser.Long - 33)) | (1 << (CParser.Register - 33)) | (1 << (CParser.Short - 33)) | (1 << (CParser.Signed - 33)) | (1 << (CParser.Static - 33)) | (1 << (CParser.Struct - 33)) | (1 << (CParser.Typedef - 33)) | (1 << (CParser.Union - 33)) | (1 << (CParser.Unsigned - 33)) | (1 << (CParser.Void - 33)) | (1 << (CParser.Alignas - 33)) | (1 << (CParser.Atomic - 33)) | (1 << (CParser.Bool - 33)) | (1 << (CParser.Complex - 33)) | (1 << (CParser.Noreturn - 33)) | (1 << (CParser.StaticAssert - 33)) | (1 << (CParser.ThreadLocal - 33)) | (1 << (CParser.LeftParen - 33)))) !== 0) || ((((_la - 77)) & ~0x1f) == 0 && ((1 << (_la - 77)) & ((1 << (CParser.Star - 77)) | (1 << (CParser.Caret - 77)) | (1 << (CParser.Semi - 77)) | (1 << (CParser.Identifier - 77)))) !== 0) || ((((_la - 109)) & ~0x1f) == 0 && ((1 << (_la - 109)) & ((1 << (CParser.IfDefine - 109)) | (1 << (CParser.EndIfDefine - 109)) | (1 << (CParser.ComplexDefine - 109)) | (1 << (CParser.IncludeDirective - 109)))) !== 0)) {
	            this.state = 176;
	            this.translationUnit();
	        }

	        this.state = 179;
	        this.match(CParser.EOF);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	translationUnit() {
	    let localctx = new TranslationUnitContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 2, CParser.RULE_translationUnit);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 183; 
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        do {
	            this.state = 183;
	            this._errHandler.sync(this);
	            switch(this._input.LA(1)) {
	            case CParser.IncludeDirective:
	                this.state = 181;
	                this.match(CParser.IncludeDirective);
	                break;
	            case CParser.T__0:
	            case CParser.T__1:
	            case CParser.T__2:
	            case CParser.T__3:
	            case CParser.T__4:
	            case CParser.T__5:
	            case CParser.T__6:
	            case CParser.T__7:
	            case CParser.T__8:
	            case CParser.Auto:
	            case CParser.Char:
	            case CParser.Const:
	            case CParser.Double:
	            case CParser.Enum:
	            case CParser.Extern:
	            case CParser.Float:
	            case CParser.Inline:
	            case CParser.Int:
	            case CParser.Long:
	            case CParser.Register:
	            case CParser.Short:
	            case CParser.Signed:
	            case CParser.Static:
	            case CParser.Struct:
	            case CParser.Typedef:
	            case CParser.Union:
	            case CParser.Unsigned:
	            case CParser.Void:
	            case CParser.Alignas:
	            case CParser.Atomic:
	            case CParser.Bool:
	            case CParser.Complex:
	            case CParser.Noreturn:
	            case CParser.StaticAssert:
	            case CParser.ThreadLocal:
	            case CParser.LeftParen:
	            case CParser.Star:
	            case CParser.Caret:
	            case CParser.Semi:
	            case CParser.Identifier:
	            case CParser.IfDefine:
	            case CParser.EndIfDefine:
	            case CParser.ComplexDefine:
	                this.state = 182;
	                this.externalDeclaration();
	                break;
	            default:
	                throw new antlr4.error.NoViableAltException(this);
	            }
	            this.state = 185; 
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        } while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 33)) & ~0x1f) == 0 && ((1 << (_la - 33)) & ((1 << (CParser.Inline - 33)) | (1 << (CParser.Int - 33)) | (1 << (CParser.Long - 33)) | (1 << (CParser.Register - 33)) | (1 << (CParser.Short - 33)) | (1 << (CParser.Signed - 33)) | (1 << (CParser.Static - 33)) | (1 << (CParser.Struct - 33)) | (1 << (CParser.Typedef - 33)) | (1 << (CParser.Union - 33)) | (1 << (CParser.Unsigned - 33)) | (1 << (CParser.Void - 33)) | (1 << (CParser.Alignas - 33)) | (1 << (CParser.Atomic - 33)) | (1 << (CParser.Bool - 33)) | (1 << (CParser.Complex - 33)) | (1 << (CParser.Noreturn - 33)) | (1 << (CParser.StaticAssert - 33)) | (1 << (CParser.ThreadLocal - 33)) | (1 << (CParser.LeftParen - 33)))) !== 0) || ((((_la - 77)) & ~0x1f) == 0 && ((1 << (_la - 77)) & ((1 << (CParser.Star - 77)) | (1 << (CParser.Caret - 77)) | (1 << (CParser.Semi - 77)) | (1 << (CParser.Identifier - 77)))) !== 0) || ((((_la - 109)) & ~0x1f) == 0 && ((1 << (_la - 109)) & ((1 << (CParser.IfDefine - 109)) | (1 << (CParser.EndIfDefine - 109)) | (1 << (CParser.ComplexDefine - 109)) | (1 << (CParser.IncludeDirective - 109)))) !== 0));
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	externalDeclaration() {
	    let localctx = new ExternalDeclarationContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 4, CParser.RULE_externalDeclaration);
	    try {
	        this.state = 191;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,3,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 187;
	            this.match(CParser.ComplexDefine);
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 188;
	            this.functionDefinition();
	            break;

	        case 3:
	            this.enterOuterAlt(localctx, 3);
	            this.state = 189;
	            this.declaration();
	            break;

	        case 4:
	            this.enterOuterAlt(localctx, 4);
	            this.state = 190;
	            this.match(CParser.Semi);
	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	functionDefinition() {
	    let localctx = new FunctionDefinitionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 6, CParser.RULE_functionDefinition);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 194;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,4,this._ctx);
	        if(la_===1) {
	            this.state = 193;
	            this.declarationSpecifiers();

	        }
	        this.state = 196;
	        this.declarator();
	        this.state = 198;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 33)) & ~0x1f) == 0 && ((1 << (_la - 33)) & ((1 << (CParser.Inline - 33)) | (1 << (CParser.Int - 33)) | (1 << (CParser.Long - 33)) | (1 << (CParser.Register - 33)) | (1 << (CParser.Short - 33)) | (1 << (CParser.Signed - 33)) | (1 << (CParser.Static - 33)) | (1 << (CParser.Struct - 33)) | (1 << (CParser.Typedef - 33)) | (1 << (CParser.Union - 33)) | (1 << (CParser.Unsigned - 33)) | (1 << (CParser.Void - 33)) | (1 << (CParser.Alignas - 33)) | (1 << (CParser.Atomic - 33)) | (1 << (CParser.Bool - 33)) | (1 << (CParser.Complex - 33)) | (1 << (CParser.Noreturn - 33)) | (1 << (CParser.StaticAssert - 33)) | (1 << (CParser.ThreadLocal - 33)))) !== 0) || _la===CParser.Identifier) {
	            this.state = 197;
	            this.declarationList();
	        }

	        this.state = 200;
	        this.compoundStatement();
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	declarationList() {
	    let localctx = new DeclarationListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 8, CParser.RULE_declarationList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 203; 
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        do {
	            this.state = 202;
	            this.declaration();
	            this.state = 205; 
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        } while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 33)) & ~0x1f) == 0 && ((1 << (_la - 33)) & ((1 << (CParser.Inline - 33)) | (1 << (CParser.Int - 33)) | (1 << (CParser.Long - 33)) | (1 << (CParser.Register - 33)) | (1 << (CParser.Short - 33)) | (1 << (CParser.Signed - 33)) | (1 << (CParser.Static - 33)) | (1 << (CParser.Struct - 33)) | (1 << (CParser.Typedef - 33)) | (1 << (CParser.Union - 33)) | (1 << (CParser.Unsigned - 33)) | (1 << (CParser.Void - 33)) | (1 << (CParser.Alignas - 33)) | (1 << (CParser.Atomic - 33)) | (1 << (CParser.Bool - 33)) | (1 << (CParser.Complex - 33)) | (1 << (CParser.Noreturn - 33)) | (1 << (CParser.StaticAssert - 33)) | (1 << (CParser.ThreadLocal - 33)))) !== 0) || _la===CParser.Identifier);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	declaration() {
	    let localctx = new DeclarationContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 10, CParser.RULE_declaration);
	    var _la = 0; // Token type
	    try {
	        this.state = 214;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.T__0:
	        case CParser.T__1:
	        case CParser.T__2:
	        case CParser.T__3:
	        case CParser.T__4:
	        case CParser.T__5:
	        case CParser.T__6:
	        case CParser.T__7:
	        case CParser.T__8:
	        case CParser.Auto:
	        case CParser.Char:
	        case CParser.Const:
	        case CParser.Double:
	        case CParser.Enum:
	        case CParser.Extern:
	        case CParser.Float:
	        case CParser.Inline:
	        case CParser.Int:
	        case CParser.Long:
	        case CParser.Register:
	        case CParser.Short:
	        case CParser.Signed:
	        case CParser.Static:
	        case CParser.Struct:
	        case CParser.Typedef:
	        case CParser.Union:
	        case CParser.Unsigned:
	        case CParser.Void:
	        case CParser.Alignas:
	        case CParser.Atomic:
	        case CParser.Bool:
	        case CParser.Complex:
	        case CParser.Noreturn:
	        case CParser.ThreadLocal:
	        case CParser.Identifier:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 207;
	            this.declarationSpecifiers();
	            this.state = 209;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(((((_la - 61)) & ~0x1f) == 0 && ((1 << (_la - 61)) & ((1 << (CParser.LeftParen - 61)) | (1 << (CParser.Star - 61)) | (1 << (CParser.Caret - 61)))) !== 0) || ((((_la - 107)) & ~0x1f) == 0 && ((1 << (_la - 107)) & ((1 << (CParser.Identifier - 107)) | (1 << (CParser.IfDefine - 107)) | (1 << (CParser.EndIfDefine - 107)) | (1 << (CParser.ComplexDefine - 107)))) !== 0)) {
	                this.state = 208;
	                this.initDeclaratorList();
	            }

	            this.state = 211;
	            this.match(CParser.Semi);
	            break;
	        case CParser.StaticAssert:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 213;
	            this.staticAssertDeclaration();
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	declarationSpecifiers() {
	    let localctx = new DeclarationSpecifiersContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 12, CParser.RULE_declarationSpecifiers);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 217; 
	        this._errHandler.sync(this);
	        var _alt = 1;
	        do {
	        	switch (_alt) {
	        	case 1:
	        		this.state = 216;
	        		this.declarationSpecifier();
	        		break;
	        	default:
	        		throw new antlr4.error.NoViableAltException(this);
	        	}
	        	this.state = 219; 
	        	this._errHandler.sync(this);
	        	_alt = this._interp.adaptivePredict(this._input,9, this._ctx);
	        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	initDeclaratorList() {
	    let localctx = new InitDeclaratorListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 14, CParser.RULE_initDeclaratorList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 221;
	        this.initDeclarator();
	        this.state = 226;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Comma) {
	            this.state = 222;
	            this.match(CParser.Comma);
	            this.state = 223;
	            this.initDeclarator();
	            this.state = 228;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	initDeclarator() {
	    let localctx = new InitDeclaratorContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 16, CParser.RULE_initDeclarator);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 229;
	        this.declarator();
	        this.state = 232;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if(_la===CParser.Assign) {
	            this.state = 230;
	            this.match(CParser.Assign);
	            this.state = 231;
	            this.initializer();
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	staticAssertDeclaration() {
	    let localctx = new StaticAssertDeclarationContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 18, CParser.RULE_staticAssertDeclaration);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 234;
	        this.match(CParser.StaticAssert);
	        this.state = 235;
	        this.match(CParser.LeftParen);
	        this.state = 236;
	        this.constantExpression();
	        this.state = 237;
	        this.match(CParser.Comma);
	        this.state = 239; 
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        do {
	            this.state = 238;
	            this.match(CParser.StringLiteral);
	            this.state = 241; 
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        } while(_la===CParser.StringLiteral);
	        this.state = 243;
	        this.match(CParser.RightParen);
	        this.state = 244;
	        this.match(CParser.Semi);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	declarationSpecifier() {
	    let localctx = new DeclarationSpecifierContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 20, CParser.RULE_declarationSpecifier);
	    try {
	        this.state = 250;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.Auto:
	        case CParser.Const:
	        case CParser.Extern:
	        case CParser.Register:
	        case CParser.Static:
	        case CParser.Typedef:
	        case CParser.ThreadLocal:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 246;
	            this.storageClassSpecifier();
	            break;
	        case CParser.T__0:
	        case CParser.T__1:
	        case CParser.T__2:
	        case CParser.T__3:
	        case CParser.T__4:
	        case CParser.Char:
	        case CParser.Double:
	        case CParser.Enum:
	        case CParser.Float:
	        case CParser.Int:
	        case CParser.Long:
	        case CParser.Short:
	        case CParser.Signed:
	        case CParser.Struct:
	        case CParser.Union:
	        case CParser.Unsigned:
	        case CParser.Void:
	        case CParser.Atomic:
	        case CParser.Bool:
	        case CParser.Complex:
	        case CParser.Identifier:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 247;
	            this.typeSpecifier(0);
	            break;
	        case CParser.T__5:
	        case CParser.T__6:
	        case CParser.T__7:
	        case CParser.T__8:
	        case CParser.Inline:
	        case CParser.Noreturn:
	            this.enterOuterAlt(localctx, 3);
	            this.state = 248;
	            this.functionSpecifier();
	            break;
	        case CParser.Alignas:
	            this.enterOuterAlt(localctx, 4);
	            this.state = 249;
	            this.alignmentSpecifier();
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	storageClassSpecifier() {
	    let localctx = new StorageClassSpecifierContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 22, CParser.RULE_storageClassSpecifier);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 252;
	        _la = this._input.LA(1);
	        if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.Auto) | (1 << CParser.Const) | (1 << CParser.Extern))) !== 0) || ((((_la - 36)) & ~0x1f) == 0 && ((1 << (_la - 36)) & ((1 << (CParser.Register - 36)) | (1 << (CParser.Static - 36)) | (1 << (CParser.Typedef - 36)) | (1 << (CParser.ThreadLocal - 36)))) !== 0))) {
	        this._errHandler.recoverInline(this);
	        }
	        else {
	        	this._errHandler.reportMatch(this);
	            this.consume();
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}


	typeSpecifier(_p) {
		if(_p===undefined) {
		    _p = 0;
		}
	    const _parentctx = this._ctx;
	    const _parentState = this.state;
	    let localctx = new TypeSpecifierContext(this, this._ctx, _parentState);
	    let _prevctx = localctx;
	    const _startState = 24;
	    this.enterRecursionRule(localctx, 24, CParser.RULE_typeSpecifier, _p);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 269;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.T__0:
	        case CParser.T__1:
	        case CParser.T__2:
	        case CParser.Char:
	        case CParser.Double:
	        case CParser.Float:
	        case CParser.Int:
	        case CParser.Long:
	        case CParser.Short:
	        case CParser.Signed:
	        case CParser.Unsigned:
	        case CParser.Void:
	        case CParser.Bool:
	        case CParser.Complex:
	            this.state = 255;
	            _la = this._input.LA(1);
	            if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.Char) | (1 << CParser.Double) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)))) !== 0))) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            break;
	        case CParser.T__3:
	            this.state = 256;
	            this.match(CParser.T__3);
	            this.state = 257;
	            this.match(CParser.LeftParen);
	            this.state = 258;
	            _la = this._input.LA(1);
	            if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0))) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            this.state = 259;
	            this.match(CParser.RightParen);
	            break;
	        case CParser.Atomic:
	            this.state = 260;
	            this.atomicTypeSpecifier();
	            break;
	        case CParser.Struct:
	        case CParser.Union:
	            this.state = 261;
	            this.structOrUnionSpecifier();
	            break;
	        case CParser.Enum:
	            this.state = 262;
	            this.enumSpecifier();
	            break;
	        case CParser.Identifier:
	            this.state = 263;
	            this.typedefName();
	            break;
	        case CParser.T__4:
	            this.state = 264;
	            this.match(CParser.T__4);
	            this.state = 265;
	            this.match(CParser.LeftParen);
	            this.state = 266;
	            this.constantExpression();
	            this.state = 267;
	            this.match(CParser.RightParen);
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	        this._ctx.stop = this._input.LT(-1);
	        this.state = 275;
	        this._errHandler.sync(this);
	        var _alt = this._interp.adaptivePredict(this._input,15,this._ctx)
	        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	            if(_alt===1) {
	                if(this._parseListeners!==null) {
	                    this.triggerExitRuleEvent();
	                }
	                _prevctx = localctx;
	                localctx = new TypeSpecifierContext(this, _parentctx, _parentState);
	                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_typeSpecifier);
	                this.state = 271;
	                if (!( this.precpred(this._ctx, 1))) {
	                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
	                }
	                this.state = 272;
	                this.pointer(); 
	            }
	            this.state = 277;
	            this._errHandler.sync(this);
	            _alt = this._interp.adaptivePredict(this._input,15,this._ctx);
	        }

	    } catch( error) {
	        if(error instanceof antlr4.error.RecognitionException) {
		        localctx.exception = error;
		        this._errHandler.reportError(this, error);
		        this._errHandler.recover(this, error);
		    } else {
		    	throw error;
		    }
	    } finally {
	        this.unrollRecursionContexts(_parentctx)
	    }
	    return localctx;
	}



	atomicTypeSpecifier() {
	    let localctx = new AtomicTypeSpecifierContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 26, CParser.RULE_atomicTypeSpecifier);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 278;
	        this.match(CParser.Atomic);
	        this.state = 279;
	        this.match(CParser.LeftParen);
	        this.state = 280;
	        this.typeName();
	        this.state = 281;
	        this.match(CParser.RightParen);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	typeName() {
	    let localctx = new TypeNameContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 28, CParser.RULE_typeName);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 283;
	        this.specifierQualifierList();
	        this.state = 285;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if(((((_la - 61)) & ~0x1f) == 0 && ((1 << (_la - 61)) & ((1 << (CParser.LeftParen - 61)) | (1 << (CParser.LeftBracket - 61)) | (1 << (CParser.Star - 61)) | (1 << (CParser.Caret - 61)))) !== 0)) {
	            this.state = 284;
	            this.abstractDeclarator();
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	structOrUnionSpecifier() {
	    let localctx = new StructOrUnionSpecifierContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 30, CParser.RULE_structOrUnionSpecifier);
	    var _la = 0; // Token type
	    try {
	        this.state = 298;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,18,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 287;
	            this.structOrUnion();
	            this.state = 289;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.Identifier) {
	                this.state = 288;
	                this.match(CParser.Identifier);
	            }

	            this.state = 291;
	            this.match(CParser.LeftBrace);
	            this.state = 292;
	            this.structDeclarationList();
	            this.state = 293;
	            this.match(CParser.RightBrace);
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 295;
	            this.structOrUnion();
	            this.state = 296;
	            this.match(CParser.Identifier);
	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	structOrUnion() {
	    let localctx = new StructOrUnionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 32, CParser.RULE_structOrUnion);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 300;
	        _la = this._input.LA(1);
	        if(!(_la===CParser.Struct || _la===CParser.Union)) {
	        this._errHandler.recoverInline(this);
	        }
	        else {
	        	this._errHandler.reportMatch(this);
	            this.consume();
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	structDeclarationList() {
	    let localctx = new StructDeclarationListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 34, CParser.RULE_structDeclarationList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 303; 
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        do {
	            this.state = 302;
	            this.structDeclaration();
	            this.state = 305; 
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        } while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Restrict - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Struct - 34)) | (1 << (CParser.Union - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Volatile - 34)) | (1 << (CParser.Atomic - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)) | (1 << (CParser.StaticAssert - 34)))) !== 0) || _la===CParser.Identifier);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	structDeclaration() {
	    let localctx = new StructDeclarationContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 36, CParser.RULE_structDeclaration);
	    var _la = 0; // Token type
	    try {
	        this.state = 314;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.T__0:
	        case CParser.T__1:
	        case CParser.T__2:
	        case CParser.T__3:
	        case CParser.T__4:
	        case CParser.Char:
	        case CParser.Const:
	        case CParser.Double:
	        case CParser.Enum:
	        case CParser.Float:
	        case CParser.Int:
	        case CParser.Long:
	        case CParser.Restrict:
	        case CParser.Short:
	        case CParser.Signed:
	        case CParser.Struct:
	        case CParser.Union:
	        case CParser.Unsigned:
	        case CParser.Void:
	        case CParser.Volatile:
	        case CParser.Atomic:
	        case CParser.Bool:
	        case CParser.Complex:
	        case CParser.Identifier:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 307;
	            this.specifierQualifierList();
	            this.state = 309;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(((((_la - 61)) & ~0x1f) == 0 && ((1 << (_la - 61)) & ((1 << (CParser.LeftParen - 61)) | (1 << (CParser.Star - 61)) | (1 << (CParser.Caret - 61)) | (1 << (CParser.Colon - 61)))) !== 0) || ((((_la - 107)) & ~0x1f) == 0 && ((1 << (_la - 107)) & ((1 << (CParser.Identifier - 107)) | (1 << (CParser.IfDefine - 107)) | (1 << (CParser.EndIfDefine - 107)) | (1 << (CParser.ComplexDefine - 107)))) !== 0)) {
	                this.state = 308;
	                this.structDeclaratorList();
	            }

	            this.state = 311;
	            this.match(CParser.Semi);
	            break;
	        case CParser.StaticAssert:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 313;
	            this.staticAssertDeclaration();
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	specifierQualifierList() {
	    let localctx = new SpecifierQualifierListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 38, CParser.RULE_specifierQualifierList);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 318;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,22,this._ctx);
	        switch(la_) {
	        case 1:
	            this.state = 316;
	            this.typeSpecifier(0);
	            break;

	        case 2:
	            this.state = 317;
	            this.typeQualifier();
	            break;

	        }
	        this.state = 321;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,23,this._ctx);
	        if(la_===1) {
	            this.state = 320;
	            this.specifierQualifierList();

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	structDeclaratorList() {
	    let localctx = new StructDeclaratorListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 40, CParser.RULE_structDeclaratorList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 323;
	        this.structDeclarator();
	        this.state = 328;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Comma) {
	            this.state = 324;
	            this.match(CParser.Comma);
	            this.state = 325;
	            this.structDeclarator();
	            this.state = 330;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	structDeclarator() {
	    let localctx = new StructDeclaratorContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 42, CParser.RULE_structDeclarator);
	    var _la = 0; // Token type
	    try {
	        this.state = 337;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,26,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 331;
	            this.declarator();
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 333;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(((((_la - 61)) & ~0x1f) == 0 && ((1 << (_la - 61)) & ((1 << (CParser.LeftParen - 61)) | (1 << (CParser.Star - 61)) | (1 << (CParser.Caret - 61)))) !== 0) || ((((_la - 107)) & ~0x1f) == 0 && ((1 << (_la - 107)) & ((1 << (CParser.Identifier - 107)) | (1 << (CParser.IfDefine - 107)) | (1 << (CParser.EndIfDefine - 107)) | (1 << (CParser.ComplexDefine - 107)))) !== 0)) {
	                this.state = 332;
	                this.declarator();
	            }

	            this.state = 335;
	            this.match(CParser.Colon);
	            this.state = 336;
	            this.constantExpression();
	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	enumSpecifier() {
	    let localctx = new EnumSpecifierContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 44, CParser.RULE_enumSpecifier);
	    var _la = 0; // Token type
	    try {
	        this.state = 352;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,29,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 339;
	            this.match(CParser.Enum);
	            this.state = 341;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.Identifier) {
	                this.state = 340;
	                this.match(CParser.Identifier);
	            }

	            this.state = 343;
	            this.match(CParser.LeftBrace);
	            this.state = 344;
	            this.enumeratorList();
	            this.state = 346;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.Comma) {
	                this.state = 345;
	                this.match(CParser.Comma);
	            }

	            this.state = 348;
	            this.match(CParser.RightBrace);
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 350;
	            this.match(CParser.Enum);
	            this.state = 351;
	            this.match(CParser.Identifier);
	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	enumeratorList() {
	    let localctx = new EnumeratorListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 46, CParser.RULE_enumeratorList);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 354;
	        this.enumerator();
	        this.state = 359;
	        this._errHandler.sync(this);
	        var _alt = this._interp.adaptivePredict(this._input,30,this._ctx)
	        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	            if(_alt===1) {
	                this.state = 355;
	                this.match(CParser.Comma);
	                this.state = 356;
	                this.enumerator(); 
	            }
	            this.state = 361;
	            this._errHandler.sync(this);
	            _alt = this._interp.adaptivePredict(this._input,30,this._ctx);
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	enumerator() {
	    let localctx = new EnumeratorContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 48, CParser.RULE_enumerator);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 362;
	        this.enumerationConstant();
	        this.state = 365;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if(_la===CParser.Assign) {
	            this.state = 363;
	            this.match(CParser.Assign);
	            this.state = 364;
	            this.constantExpression();
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	enumerationConstant() {
	    let localctx = new EnumerationConstantContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 50, CParser.RULE_enumerationConstant);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 367;
	        this.match(CParser.Identifier);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	typedefName() {
	    let localctx = new TypedefNameContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 52, CParser.RULE_typedefName);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 369;
	        this.match(CParser.Identifier);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	constantExpression() {
	    let localctx = new ConstantExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 54, CParser.RULE_constantExpression);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 371;
	        this.conditionalExpression();
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	pointer() {
	    let localctx = new PointerContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 56, CParser.RULE_pointer);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 377; 
	        this._errHandler.sync(this);
	        var _alt = 1;
	        do {
	        	switch (_alt) {
	        	case 1:
	        		this.state = 373;
	        		_la = this._input.LA(1);
	        		if(!(_la===CParser.Star || _la===CParser.Caret)) {
	        		this._errHandler.recoverInline(this);
	        		}
	        		else {
	        			this._errHandler.reportMatch(this);
	        		    this.consume();
	        		}
	        		this.state = 375;
	        		this._errHandler.sync(this);
	        		var la_ = this._interp.adaptivePredict(this._input,32,this._ctx);
	        		if(la_===1) {
	        		    this.state = 374;
	        		    this.typeQualifierList();

	        		}
	        		break;
	        	default:
	        		throw new antlr4.error.NoViableAltException(this);
	        	}
	        	this.state = 379; 
	        	this._errHandler.sync(this);
	        	_alt = this._interp.adaptivePredict(this._input,33, this._ctx);
	        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	typeQualifier() {
	    let localctx = new TypeQualifierContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 58, CParser.RULE_typeQualifier);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 381;
	        _la = this._input.LA(1);
	        if(!(_la===CParser.Const || ((((_la - 37)) & ~0x1f) == 0 && ((1 << (_la - 37)) & ((1 << (CParser.Restrict - 37)) | (1 << (CParser.Volatile - 37)) | (1 << (CParser.Atomic - 37)))) !== 0))) {
	        this._errHandler.recoverInline(this);
	        }
	        else {
	        	this._errHandler.reportMatch(this);
	            this.consume();
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	functionSpecifier() {
	    let localctx = new FunctionSpecifierContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 60, CParser.RULE_functionSpecifier);
	    var _la = 0; // Token type
	    try {
	        this.state = 389;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.T__5:
	        case CParser.T__6:
	        case CParser.Inline:
	        case CParser.Noreturn:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 383;
	            _la = this._input.LA(1);
	            if(!(_la===CParser.T__5 || _la===CParser.T__6 || _la===CParser.Inline || _la===CParser.Noreturn)) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            break;
	        case CParser.T__8:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 384;
	            this.gccAttributeSpecifier();
	            break;
	        case CParser.T__7:
	            this.enterOuterAlt(localctx, 3);
	            this.state = 385;
	            this.match(CParser.T__7);
	            this.state = 386;
	            this.match(CParser.LeftParen);
	            this.state = 387;
	            this.match(CParser.Identifier);
	            this.state = 388;
	            this.match(CParser.RightParen);
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	gccAttributeSpecifier() {
	    let localctx = new GccAttributeSpecifierContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 62, CParser.RULE_gccAttributeSpecifier);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 391;
	        this.match(CParser.T__8);
	        this.state = 392;
	        this.match(CParser.LeftParen);
	        this.state = 393;
	        this.match(CParser.LeftParen);
	        this.state = 394;
	        this.gccAttributeList();
	        this.state = 395;
	        this.match(CParser.RightParen);
	        this.state = 396;
	        this.match(CParser.RightParen);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	gccAttributeList() {
	    let localctx = new GccAttributeListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 64, CParser.RULE_gccAttributeList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 399;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Constant) | (1 << CParser.StringLiteral) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.If - 32)) | (1 << (CParser.Inline - 32)) | (1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftBracket - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBracket - 64)) | (1 << (CParser.LeftBrace - 64)) | (1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.MinusAssign - 96)) | (1 << (CParser.LeftShiftAssign - 96)) | (1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.DigitSequence - 96)) | (1 << (CParser.IfDefine - 96)) | (1 << (CParser.IfNDefine - 96)) | (1 << (CParser.EndIfDefine - 96)) | (1 << (CParser.AsmBlock - 96)) | (1 << (CParser.LineAfterPreprocessing - 96)) | (1 << (CParser.LineDirective - 96)) | (1 << (CParser.PragmaDirective - 96)) | (1 << (CParser.ComplexDefine - 96)) | (1 << (CParser.IncludeDirective - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) {
	            this.state = 398;
	            this.gccAttribute();
	        }

	        this.state = 407;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Comma) {
	            this.state = 401;
	            this.match(CParser.Comma);
	            this.state = 403;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Constant) | (1 << CParser.StringLiteral) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.If - 32)) | (1 << (CParser.Inline - 32)) | (1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftBracket - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBracket - 64)) | (1 << (CParser.LeftBrace - 64)) | (1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.MinusAssign - 96)) | (1 << (CParser.LeftShiftAssign - 96)) | (1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.DigitSequence - 96)) | (1 << (CParser.IfDefine - 96)) | (1 << (CParser.IfNDefine - 96)) | (1 << (CParser.EndIfDefine - 96)) | (1 << (CParser.AsmBlock - 96)) | (1 << (CParser.LineAfterPreprocessing - 96)) | (1 << (CParser.LineDirective - 96)) | (1 << (CParser.PragmaDirective - 96)) | (1 << (CParser.ComplexDefine - 96)) | (1 << (CParser.IncludeDirective - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) {
	                this.state = 402;
	                this.gccAttribute();
	            }

	            this.state = 409;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	gccAttribute() {
	    let localctx = new GccAttributeContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 66, CParser.RULE_gccAttribute);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 410;
	        _la = this._input.LA(1);
	        if(_la<=0 || ((((_la - 61)) & ~0x1f) == 0 && ((1 << (_la - 61)) & ((1 << (CParser.LeftParen - 61)) | (1 << (CParser.RightParen - 61)) | (1 << (CParser.Comma - 61)))) !== 0)) {
	        this._errHandler.recoverInline(this);
	        }
	        else {
	        	this._errHandler.reportMatch(this);
	            this.consume();
	        }
	        this.state = 416;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if(_la===CParser.LeftParen) {
	            this.state = 411;
	            this.match(CParser.LeftParen);
	            this.state = 413;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	                this.state = 412;
	                this.argumentExpressionList();
	            }

	            this.state = 415;
	            this.match(CParser.RightParen);
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	alignmentSpecifier() {
	    let localctx = new AlignmentSpecifierContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 68, CParser.RULE_alignmentSpecifier);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 418;
	        this.match(CParser.Alignas);
	        this.state = 419;
	        this.match(CParser.LeftParen);
	        this.state = 422;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,40,this._ctx);
	        switch(la_) {
	        case 1:
	            this.state = 420;
	            this.typeName();
	            break;

	        case 2:
	            this.state = 421;
	            this.constantExpression();
	            break;

	        }
	        this.state = 424;
	        this.match(CParser.RightParen);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	declarator() {
	    let localctx = new DeclaratorContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 70, CParser.RULE_declarator);
	    var _la = 0; // Token type
	    try {
	        this.state = 439;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.LeftParen:
	        case CParser.Star:
	        case CParser.Caret:
	        case CParser.Identifier:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 427;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.Star || _la===CParser.Caret) {
	                this.state = 426;
	                this.pointer();
	            }

	            this.state = 429;
	            this.directDeclarator(0);
	            this.state = 433;
	            this._errHandler.sync(this);
	            var _alt = this._interp.adaptivePredict(this._input,42,this._ctx)
	            while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	                if(_alt===1) {
	                    this.state = 430;
	                    this.gccDeclaratorExtension(); 
	                }
	                this.state = 435;
	                this._errHandler.sync(this);
	                _alt = this._interp.adaptivePredict(this._input,42,this._ctx);
	            }

	            break;
	        case CParser.IfDefine:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 436;
	            this.match(CParser.IfDefine);
	            break;
	        case CParser.EndIfDefine:
	            this.enterOuterAlt(localctx, 3);
	            this.state = 437;
	            this.match(CParser.EndIfDefine);
	            break;
	        case CParser.ComplexDefine:
	            this.enterOuterAlt(localctx, 4);
	            this.state = 438;
	            this.match(CParser.ComplexDefine);
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}


	directDeclarator(_p) {
		if(_p===undefined) {
		    _p = 0;
		}
	    const _parentctx = this._ctx;
	    const _parentState = this.state;
	    let localctx = new DirectDeclaratorContext(this, this._ctx, _parentState);
	    let _prevctx = localctx;
	    const _startState = 72;
	    this.enterRecursionRule(localctx, 72, CParser.RULE_directDeclarator, _p);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 459;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,45,this._ctx);
	        switch(la_) {
	        case 1:
	            this.state = 442;
	            this.idName();
	            break;

	        case 2:
	            this.state = 443;
	            this.match(CParser.LeftParen);
	            this.state = 444;
	            this.declarator();
	            this.state = 445;
	            this.match(CParser.RightParen);
	            break;

	        case 3:
	            this.state = 447;
	            this.idName();
	            this.state = 448;
	            this.match(CParser.Colon);
	            this.state = 449;
	            this.match(CParser.DigitSequence);
	            break;

	        case 4:
	            this.state = 451;
	            this.match(CParser.LeftParen);
	            this.state = 453;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.Char) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Float))) !== 0) || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Int - 34)) | (1 << (CParser.Long - 34)) | (1 << (CParser.Short - 34)) | (1 << (CParser.Signed - 34)) | (1 << (CParser.Struct - 34)) | (1 << (CParser.Union - 34)) | (1 << (CParser.Unsigned - 34)) | (1 << (CParser.Void - 34)) | (1 << (CParser.Atomic - 34)) | (1 << (CParser.Bool - 34)) | (1 << (CParser.Complex - 34)))) !== 0) || _la===CParser.Identifier) {
	                this.state = 452;
	                this.typeSpecifier(0);
	            }

	            this.state = 455;
	            this.pointer();
	            this.state = 456;
	            this.directDeclarator(0);
	            this.state = 457;
	            this.match(CParser.RightParen);
	            break;

	        }
	        this._ctx.stop = this._input.LT(-1);
	        this.state = 506;
	        this._errHandler.sync(this);
	        var _alt = this._interp.adaptivePredict(this._input,52,this._ctx)
	        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	            if(_alt===1) {
	                if(this._parseListeners!==null) {
	                    this.triggerExitRuleEvent();
	                }
	                _prevctx = localctx;
	                this.state = 504;
	                this._errHandler.sync(this);
	                var la_ = this._interp.adaptivePredict(this._input,51,this._ctx);
	                switch(la_) {
	                case 1:
	                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
	                    this.state = 461;
	                    if (!( this.precpred(this._ctx, 8))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 8)");
	                    }
	                    this.state = 462;
	                    this.match(CParser.LeftBracket);
	                    this.state = 464;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                    if(_la===CParser.Const || ((((_la - 37)) & ~0x1f) == 0 && ((1 << (_la - 37)) & ((1 << (CParser.Restrict - 37)) | (1 << (CParser.Volatile - 37)) | (1 << (CParser.Atomic - 37)))) !== 0)) {
	                        this.state = 463;
	                        this.typeQualifierList();
	                    }

	                    this.state = 467;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                    if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	                        this.state = 466;
	                        this.assignmentExpression();
	                    }

	                    this.state = 469;
	                    this.match(CParser.RightBracket);
	                    break;

	                case 2:
	                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
	                    this.state = 470;
	                    if (!( this.precpred(this._ctx, 7))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 7)");
	                    }
	                    this.state = 471;
	                    this.match(CParser.LeftBracket);
	                    this.state = 472;
	                    this.match(CParser.Static);
	                    this.state = 474;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                    if(_la===CParser.Const || ((((_la - 37)) & ~0x1f) == 0 && ((1 << (_la - 37)) & ((1 << (CParser.Restrict - 37)) | (1 << (CParser.Volatile - 37)) | (1 << (CParser.Atomic - 37)))) !== 0)) {
	                        this.state = 473;
	                        this.typeQualifierList();
	                    }

	                    this.state = 476;
	                    this.assignmentExpression();
	                    this.state = 477;
	                    this.match(CParser.RightBracket);
	                    break;

	                case 3:
	                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
	                    this.state = 479;
	                    if (!( this.precpred(this._ctx, 6))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)");
	                    }
	                    this.state = 480;
	                    this.match(CParser.LeftBracket);
	                    this.state = 481;
	                    this.typeQualifierList();
	                    this.state = 482;
	                    this.match(CParser.Static);
	                    this.state = 483;
	                    this.assignmentExpression();
	                    this.state = 484;
	                    this.match(CParser.RightBracket);
	                    break;

	                case 4:
	                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
	                    this.state = 486;
	                    if (!( this.precpred(this._ctx, 5))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)");
	                    }
	                    this.state = 487;
	                    this.match(CParser.LeftBracket);
	                    this.state = 489;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                    if(_la===CParser.Const || ((((_la - 37)) & ~0x1f) == 0 && ((1 << (_la - 37)) & ((1 << (CParser.Restrict - 37)) | (1 << (CParser.Volatile - 37)) | (1 << (CParser.Atomic - 37)))) !== 0)) {
	                        this.state = 488;
	                        this.typeQualifierList();
	                    }

	                    this.state = 491;
	                    this.match(CParser.Star);
	                    this.state = 492;
	                    this.match(CParser.RightBracket);
	                    break;

	                case 5:
	                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
	                    this.state = 493;
	                    if (!( this.precpred(this._ctx, 4))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)");
	                    }
	                    this.state = 494;
	                    this.match(CParser.LeftParen);
	                    this.state = 495;
	                    this.parameterTypeList();
	                    this.state = 496;
	                    this.match(CParser.RightParen);
	                    break;

	                case 6:
	                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
	                    this.state = 498;
	                    if (!( this.precpred(this._ctx, 3))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)");
	                    }
	                    this.state = 499;
	                    this.match(CParser.LeftParen);
	                    this.state = 501;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                    if(_la===CParser.Identifier) {
	                        this.state = 500;
	                        this.identifierList();
	                    }

	                    this.state = 503;
	                    this.match(CParser.RightParen);
	                    break;

	                } 
	            }
	            this.state = 508;
	            this._errHandler.sync(this);
	            _alt = this._interp.adaptivePredict(this._input,52,this._ctx);
	        }

	    } catch( error) {
	        if(error instanceof antlr4.error.RecognitionException) {
		        localctx.exception = error;
		        this._errHandler.reportError(this, error);
		        this._errHandler.recover(this, error);
		    } else {
		    	throw error;
		    }
	    } finally {
	        this.unrollRecursionContexts(_parentctx)
	    }
	    return localctx;
	}



	typeQualifierList() {
	    let localctx = new TypeQualifierListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 74, CParser.RULE_typeQualifierList);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 510; 
	        this._errHandler.sync(this);
	        var _alt = 1;
	        do {
	        	switch (_alt) {
	        	case 1:
	        		this.state = 509;
	        		this.typeQualifier();
	        		break;
	        	default:
	        		throw new antlr4.error.NoViableAltException(this);
	        	}
	        	this.state = 512; 
	        	this._errHandler.sync(this);
	        	_alt = this._interp.adaptivePredict(this._input,53, this._ctx);
	        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	assignmentExpression() {
	    let localctx = new AssignmentExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 76, CParser.RULE_assignmentExpression);
	    try {
	        this.state = 520;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,54,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 514;
	            this.conditionalExpression();
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 515;
	            this.unaryExpression();
	            this.state = 516;
	            this.assignmentOperator();
	            this.state = 517;
	            this.assignmentExpression();
	            break;

	        case 3:
	            this.enterOuterAlt(localctx, 3);
	            this.state = 519;
	            this.match(CParser.DigitSequence);
	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	conditionalExpression() {
	    let localctx = new ConditionalExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 78, CParser.RULE_conditionalExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 522;
	        this.logicalOrExpression();
	        this.state = 528;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if(_la===CParser.Question) {
	            this.state = 523;
	            this.match(CParser.Question);
	            this.state = 524;
	            this.expression();
	            this.state = 525;
	            this.match(CParser.Colon);
	            this.state = 526;
	            this.conditionalExpression();
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	logicalOrExpression() {
	    let localctx = new LogicalOrExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 80, CParser.RULE_logicalOrExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 530;
	        this.logicalAndExpression();
	        this.state = 535;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.OrOr) {
	            this.state = 531;
	            this.match(CParser.OrOr);
	            this.state = 532;
	            this.logicalAndExpression();
	            this.state = 537;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	logicalAndExpression() {
	    let localctx = new LogicalAndExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 82, CParser.RULE_logicalAndExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 538;
	        this.inclusiveOrExpression();
	        this.state = 543;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.AndAnd) {
	            this.state = 539;
	            this.match(CParser.AndAnd);
	            this.state = 540;
	            this.inclusiveOrExpression();
	            this.state = 545;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	inclusiveOrExpression() {
	    let localctx = new InclusiveOrExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 84, CParser.RULE_inclusiveOrExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 546;
	        this.exclusiveOrExpression();
	        this.state = 551;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Or) {
	            this.state = 547;
	            this.match(CParser.Or);
	            this.state = 548;
	            this.exclusiveOrExpression();
	            this.state = 553;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	exclusiveOrExpression() {
	    let localctx = new ExclusiveOrExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 86, CParser.RULE_exclusiveOrExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 554;
	        this.andExpression();
	        this.state = 559;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Caret) {
	            this.state = 555;
	            this.match(CParser.Caret);
	            this.state = 556;
	            this.andExpression();
	            this.state = 561;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	andExpression() {
	    let localctx = new AndExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 88, CParser.RULE_andExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 562;
	        this.equalityExpression();
	        this.state = 567;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.And) {
	            this.state = 563;
	            this.match(CParser.And);
	            this.state = 564;
	            this.equalityExpression();
	            this.state = 569;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	equalityExpression() {
	    let localctx = new EqualityExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 90, CParser.RULE_equalityExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 570;
	        this.relationalExpression();
	        this.state = 575;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Equal || _la===CParser.NotEqual) {
	            this.state = 571;
	            _la = this._input.LA(1);
	            if(!(_la===CParser.Equal || _la===CParser.NotEqual)) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            this.state = 572;
	            this.relationalExpression();
	            this.state = 577;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	relationalExpression() {
	    let localctx = new RelationalExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 92, CParser.RULE_relationalExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 578;
	        this.shiftExpression();
	        this.state = 583;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(((((_la - 67)) & ~0x1f) == 0 && ((1 << (_la - 67)) & ((1 << (CParser.Less - 67)) | (1 << (CParser.LessEqual - 67)) | (1 << (CParser.Greater - 67)) | (1 << (CParser.GreaterEqual - 67)))) !== 0)) {
	            this.state = 579;
	            _la = this._input.LA(1);
	            if(!(((((_la - 67)) & ~0x1f) == 0 && ((1 << (_la - 67)) & ((1 << (CParser.Less - 67)) | (1 << (CParser.LessEqual - 67)) | (1 << (CParser.Greater - 67)) | (1 << (CParser.GreaterEqual - 67)))) !== 0))) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            this.state = 580;
	            this.shiftExpression();
	            this.state = 585;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	shiftExpression() {
	    let localctx = new ShiftExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 94, CParser.RULE_shiftExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 586;
	        this.additiveExpression();
	        this.state = 591;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.LeftShift || _la===CParser.RightShift) {
	            this.state = 587;
	            _la = this._input.LA(1);
	            if(!(_la===CParser.LeftShift || _la===CParser.RightShift)) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            this.state = 588;
	            this.additiveExpression();
	            this.state = 593;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	additiveExpression() {
	    let localctx = new AdditiveExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 96, CParser.RULE_additiveExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 594;
	        this.multiplicativeExpression();
	        this.state = 599;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Plus || _la===CParser.Minus) {
	            this.state = 595;
	            _la = this._input.LA(1);
	            if(!(_la===CParser.Plus || _la===CParser.Minus)) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            this.state = 596;
	            this.multiplicativeExpression();
	            this.state = 601;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	multiplicativeExpression() {
	    let localctx = new MultiplicativeExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 98, CParser.RULE_multiplicativeExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 602;
	        this.castExpression();
	        this.state = 607;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(((((_la - 77)) & ~0x1f) == 0 && ((1 << (_la - 77)) & ((1 << (CParser.Star - 77)) | (1 << (CParser.Div - 77)) | (1 << (CParser.Mod - 77)))) !== 0)) {
	            this.state = 603;
	            _la = this._input.LA(1);
	            if(!(((((_la - 77)) & ~0x1f) == 0 && ((1 << (_la - 77)) & ((1 << (CParser.Star - 77)) | (1 << (CParser.Div - 77)) | (1 << (CParser.Mod - 77)))) !== 0))) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            this.state = 604;
	            this.castExpression();
	            this.state = 609;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	castExpression() {
	    let localctx = new CastExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 100, CParser.RULE_castExpression);
	    var _la = 0; // Token type
	    try {
	        this.state = 620;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,67,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 611;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.T__3) {
	                this.state = 610;
	                this.match(CParser.T__3);
	            }

	            this.state = 613;
	            this.match(CParser.LeftParen);
	            this.state = 614;
	            this.typeName();
	            this.state = 615;
	            this.match(CParser.RightParen);
	            this.state = 616;
	            this.castExpression();
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 618;
	            this.unaryExpression();
	            break;

	        case 3:
	            this.enterOuterAlt(localctx, 3);
	            this.state = 619;
	            this.match(CParser.DigitSequence);
	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	unaryExpression() {
	    let localctx = new UnaryExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 102, CParser.RULE_unaryExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 625;
	        this._errHandler.sync(this);
	        var _alt = this._interp.adaptivePredict(this._input,68,this._ctx)
	        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	            if(_alt===1) {
	                this.state = 622;
	                _la = this._input.LA(1);
	                if(!(_la===CParser.Sizeof || _la===CParser.PlusPlus || _la===CParser.MinusMinus)) {
	                this._errHandler.recoverInline(this);
	                }
	                else {
	                	this._errHandler.reportMatch(this);
	                    this.consume();
	                } 
	            }
	            this.state = 627;
	            this._errHandler.sync(this);
	            _alt = this._interp.adaptivePredict(this._input,68,this._ctx);
	        }

	        this.state = 639;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.T__3:
	        case CParser.T__9:
	        case CParser.T__10:
	        case CParser.Constant:
	        case CParser.StringLiteral:
	        case CParser.Generic:
	        case CParser.LeftParen:
	        case CParser.Identifier:
	            this.state = 628;
	            this.postfixExpression();
	            break;
	        case CParser.Plus:
	        case CParser.Minus:
	        case CParser.Star:
	        case CParser.And:
	        case CParser.Not:
	        case CParser.Tilde:
	            this.state = 629;
	            this.unaryOperator();
	            this.state = 630;
	            this.castExpression();
	            break;
	        case CParser.Sizeof:
	        case CParser.Alignof:
	            this.state = 632;
	            _la = this._input.LA(1);
	            if(!(_la===CParser.Sizeof || _la===CParser.Alignof)) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            this.state = 633;
	            this.match(CParser.LeftParen);
	            this.state = 634;
	            this.typeName();
	            this.state = 635;
	            this.match(CParser.RightParen);
	            break;
	        case CParser.AndAnd:
	            this.state = 637;
	            this.match(CParser.AndAnd);
	            this.state = 638;
	            this.match(CParser.Identifier);
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	postfixExpression() {
	    let localctx = new PostfixExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 104, CParser.RULE_postfixExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 655;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,72,this._ctx);
	        switch(la_) {
	        case 1:
	            this.state = 641;
	            this.primaryExpression();
	            break;

	        case 2:
	            this.state = 643;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.T__3) {
	                this.state = 642;
	                this.match(CParser.T__3);
	            }

	            this.state = 645;
	            this.match(CParser.LeftParen);
	            this.state = 646;
	            this.typeName();
	            this.state = 647;
	            this.match(CParser.RightParen);
	            this.state = 648;
	            this.match(CParser.LeftBrace);
	            this.state = 649;
	            this.initializerList();
	            this.state = 651;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.Comma) {
	                this.state = 650;
	                this.match(CParser.Comma);
	            }

	            this.state = 653;
	            this.match(CParser.RightBrace);
	            break;

	        }
	        this.state = 671;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(((((_la - 61)) & ~0x1f) == 0 && ((1 << (_la - 61)) & ((1 << (CParser.LeftParen - 61)) | (1 << (CParser.LeftBracket - 61)) | (1 << (CParser.PlusPlus - 61)) | (1 << (CParser.MinusMinus - 61)))) !== 0) || _la===CParser.Arrow || _la===CParser.Dot) {
	            this.state = 669;
	            this._errHandler.sync(this);
	            switch(this._input.LA(1)) {
	            case CParser.LeftBracket:
	                this.state = 657;
	                this.match(CParser.LeftBracket);
	                this.state = 658;
	                this.expression();
	                this.state = 659;
	                this.match(CParser.RightBracket);
	                break;
	            case CParser.LeftParen:
	                this.state = 661;
	                this.match(CParser.LeftParen);
	                this.state = 663;
	                this._errHandler.sync(this);
	                _la = this._input.LA(1);
	                if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	                    this.state = 662;
	                    this.argumentExpressionList();
	                }

	                this.state = 665;
	                this.match(CParser.RightParen);
	                break;
	            case CParser.Arrow:
	            case CParser.Dot:
	                this.state = 666;
	                _la = this._input.LA(1);
	                if(!(_la===CParser.Arrow || _la===CParser.Dot)) {
	                this._errHandler.recoverInline(this);
	                }
	                else {
	                	this._errHandler.reportMatch(this);
	                    this.consume();
	                }
	                this.state = 667;
	                this.match(CParser.Identifier);
	                break;
	            case CParser.PlusPlus:
	            case CParser.MinusMinus:
	                this.state = 668;
	                _la = this._input.LA(1);
	                if(!(_la===CParser.PlusPlus || _la===CParser.MinusMinus)) {
	                this._errHandler.recoverInline(this);
	                }
	                else {
	                	this._errHandler.reportMatch(this);
	                    this.consume();
	                }
	                break;
	            default:
	                throw new antlr4.error.NoViableAltException(this);
	            }
	            this.state = 673;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	primaryExpression() {
	    let localctx = new PrimaryExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 106, CParser.RULE_primaryExpression);
	    var _la = 0; // Token type
	    try {
	        this.state = 707;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,78,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 674;
	            this.match(CParser.Identifier);
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 675;
	            this.match(CParser.Constant);
	            break;

	        case 3:
	            this.enterOuterAlt(localctx, 3);
	            this.state = 677; 
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            do {
	                this.state = 676;
	                this.match(CParser.StringLiteral);
	                this.state = 679; 
	                this._errHandler.sync(this);
	                _la = this._input.LA(1);
	            } while(_la===CParser.StringLiteral);
	            break;

	        case 4:
	            this.enterOuterAlt(localctx, 4);
	            this.state = 681;
	            this.match(CParser.LeftParen);
	            this.state = 682;
	            this.expression();
	            this.state = 683;
	            this.match(CParser.RightParen);
	            break;

	        case 5:
	            this.enterOuterAlt(localctx, 5);
	            this.state = 685;
	            this.genericSelection();
	            break;

	        case 6:
	            this.enterOuterAlt(localctx, 6);
	            this.state = 687;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.T__3) {
	                this.state = 686;
	                this.match(CParser.T__3);
	            }

	            this.state = 689;
	            this.match(CParser.LeftParen);
	            this.state = 690;
	            this.compoundStatement();
	            this.state = 691;
	            this.match(CParser.RightParen);
	            break;

	        case 7:
	            this.enterOuterAlt(localctx, 7);
	            this.state = 693;
	            this.match(CParser.T__9);
	            this.state = 694;
	            this.match(CParser.LeftParen);
	            this.state = 695;
	            this.unaryExpression();
	            this.state = 696;
	            this.match(CParser.Comma);
	            this.state = 697;
	            this.typeName();
	            this.state = 698;
	            this.match(CParser.RightParen);
	            break;

	        case 8:
	            this.enterOuterAlt(localctx, 8);
	            this.state = 700;
	            this.match(CParser.T__10);
	            this.state = 701;
	            this.match(CParser.LeftParen);
	            this.state = 702;
	            this.typeName();
	            this.state = 703;
	            this.match(CParser.Comma);
	            this.state = 704;
	            this.unaryExpression();
	            this.state = 705;
	            this.match(CParser.RightParen);
	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	genericSelection() {
	    let localctx = new GenericSelectionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 108, CParser.RULE_genericSelection);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 709;
	        this.match(CParser.Generic);
	        this.state = 710;
	        this.match(CParser.LeftParen);
	        this.state = 711;
	        this.assignmentExpression();
	        this.state = 712;
	        this.match(CParser.Comma);
	        this.state = 713;
	        this.genericAssocList();
	        this.state = 714;
	        this.match(CParser.RightParen);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	genericAssocList() {
	    let localctx = new GenericAssocListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 110, CParser.RULE_genericAssocList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 716;
	        this.genericAssociation();
	        this.state = 721;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Comma) {
	            this.state = 717;
	            this.match(CParser.Comma);
	            this.state = 718;
	            this.genericAssociation();
	            this.state = 723;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	genericAssociation() {
	    let localctx = new GenericAssociationContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 112, CParser.RULE_genericAssociation);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 726;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.T__0:
	        case CParser.T__1:
	        case CParser.T__2:
	        case CParser.T__3:
	        case CParser.T__4:
	        case CParser.Char:
	        case CParser.Const:
	        case CParser.Double:
	        case CParser.Enum:
	        case CParser.Float:
	        case CParser.Int:
	        case CParser.Long:
	        case CParser.Restrict:
	        case CParser.Short:
	        case CParser.Signed:
	        case CParser.Struct:
	        case CParser.Union:
	        case CParser.Unsigned:
	        case CParser.Void:
	        case CParser.Volatile:
	        case CParser.Atomic:
	        case CParser.Bool:
	        case CParser.Complex:
	        case CParser.Identifier:
	            this.state = 724;
	            this.typeName();
	            break;
	        case CParser.Default:
	            this.state = 725;
	            this.match(CParser.Default);
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	        this.state = 728;
	        this.match(CParser.Colon);
	        this.state = 729;
	        this.assignmentExpression();
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	argumentExpressionList() {
	    let localctx = new ArgumentExpressionListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 114, CParser.RULE_argumentExpressionList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 731;
	        this.assignmentExpression();
	        this.state = 736;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Comma) {
	            this.state = 732;
	            this.match(CParser.Comma);
	            this.state = 733;
	            this.assignmentExpression();
	            this.state = 738;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	unaryOperator() {
	    let localctx = new UnaryOperatorContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 116, CParser.RULE_unaryOperator);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 739;
	        _la = this._input.LA(1);
	        if(!(((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0))) {
	        this._errHandler.recoverInline(this);
	        }
	        else {
	        	this._errHandler.reportMatch(this);
	            this.consume();
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	assignmentOperator() {
	    let localctx = new AssignmentOperatorContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 118, CParser.RULE_assignmentOperator);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 741;
	        _la = this._input.LA(1);
	        if(!(((((_la - 91)) & ~0x1f) == 0 && ((1 << (_la - 91)) & ((1 << (CParser.Assign - 91)) | (1 << (CParser.StarAssign - 91)) | (1 << (CParser.DivAssign - 91)) | (1 << (CParser.ModAssign - 91)) | (1 << (CParser.PlusAssign - 91)) | (1 << (CParser.MinusAssign - 91)) | (1 << (CParser.LeftShiftAssign - 91)) | (1 << (CParser.RightShiftAssign - 91)) | (1 << (CParser.AndAssign - 91)) | (1 << (CParser.XorAssign - 91)) | (1 << (CParser.OrAssign - 91)))) !== 0))) {
	        this._errHandler.recoverInline(this);
	        }
	        else {
	        	this._errHandler.reportMatch(this);
	            this.consume();
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	parameterTypeList() {
	    let localctx = new ParameterTypeListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 120, CParser.RULE_parameterTypeList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 743;
	        this.parameterList();
	        this.state = 746;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if(_la===CParser.Comma) {
	            this.state = 744;
	            this.match(CParser.Comma);
	            this.state = 745;
	            this.match(CParser.Ellipsis);
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	parameterList() {
	    let localctx = new ParameterListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 122, CParser.RULE_parameterList);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 748;
	        this.parameterDeclaration();
	        this.state = 753;
	        this._errHandler.sync(this);
	        var _alt = this._interp.adaptivePredict(this._input,83,this._ctx)
	        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	            if(_alt===1) {
	                this.state = 749;
	                this.match(CParser.Comma);
	                this.state = 750;
	                this.parameterDeclaration(); 
	            }
	            this.state = 755;
	            this._errHandler.sync(this);
	            _alt = this._interp.adaptivePredict(this._input,83,this._ctx);
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	parameterDeclaration() {
	    let localctx = new ParameterDeclarationContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 124, CParser.RULE_parameterDeclaration);
	    var _la = 0; // Token type
	    try {
	        this.state = 763;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,85,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 756;
	            this.declarationSpecifiers();
	            this.state = 757;
	            this.declarator();
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 759;
	            this.declarationSpecifiers2();
	            this.state = 761;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(((((_la - 61)) & ~0x1f) == 0 && ((1 << (_la - 61)) & ((1 << (CParser.LeftParen - 61)) | (1 << (CParser.LeftBracket - 61)) | (1 << (CParser.Star - 61)) | (1 << (CParser.Caret - 61)))) !== 0)) {
	                this.state = 760;
	                this.abstractDeclarator();
	            }

	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	declarationSpecifiers2() {
	    let localctx = new DeclarationSpecifiers2Context(this, this._ctx, this.state);
	    this.enterRule(localctx, 126, CParser.RULE_declarationSpecifiers2);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 766; 
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        do {
	            this.state = 765;
	            this.declarationSpecifier();
	            this.state = 768; 
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        } while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 33)) & ~0x1f) == 0 && ((1 << (_la - 33)) & ((1 << (CParser.Inline - 33)) | (1 << (CParser.Int - 33)) | (1 << (CParser.Long - 33)) | (1 << (CParser.Register - 33)) | (1 << (CParser.Short - 33)) | (1 << (CParser.Signed - 33)) | (1 << (CParser.Static - 33)) | (1 << (CParser.Struct - 33)) | (1 << (CParser.Typedef - 33)) | (1 << (CParser.Union - 33)) | (1 << (CParser.Unsigned - 33)) | (1 << (CParser.Void - 33)) | (1 << (CParser.Alignas - 33)) | (1 << (CParser.Atomic - 33)) | (1 << (CParser.Bool - 33)) | (1 << (CParser.Complex - 33)) | (1 << (CParser.Noreturn - 33)) | (1 << (CParser.ThreadLocal - 33)))) !== 0) || _la===CParser.Identifier);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	abstractDeclarator() {
	    let localctx = new AbstractDeclaratorContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 128, CParser.RULE_abstractDeclarator);
	    var _la = 0; // Token type
	    try {
	        this.state = 781;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,89,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 770;
	            this.pointer();
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 772;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.Star || _la===CParser.Caret) {
	                this.state = 771;
	                this.pointer();
	            }

	            this.state = 774;
	            this.directAbstractDeclarator(0);
	            this.state = 778;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            while(_la===CParser.T__8 || _la===CParser.T__11) {
	                this.state = 775;
	                this.gccDeclaratorExtension();
	                this.state = 780;
	                this._errHandler.sync(this);
	                _la = this._input.LA(1);
	            }
	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}


	directAbstractDeclarator(_p) {
		if(_p===undefined) {
		    _p = 0;
		}
	    const _parentctx = this._ctx;
	    const _parentState = this.state;
	    let localctx = new DirectAbstractDeclaratorContext(this, this._ctx, _parentState);
	    let _prevctx = localctx;
	    const _startState = 130;
	    this.enterRecursionRule(localctx, 130, CParser.RULE_directAbstractDeclarator, _p);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 829;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,96,this._ctx);
	        switch(la_) {
	        case 1:
	            this.state = 784;
	            this.match(CParser.LeftParen);
	            this.state = 785;
	            this.abstractDeclarator();
	            this.state = 786;
	            this.match(CParser.RightParen);
	            this.state = 790;
	            this._errHandler.sync(this);
	            var _alt = this._interp.adaptivePredict(this._input,90,this._ctx)
	            while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	                if(_alt===1) {
	                    this.state = 787;
	                    this.gccDeclaratorExtension(); 
	                }
	                this.state = 792;
	                this._errHandler.sync(this);
	                _alt = this._interp.adaptivePredict(this._input,90,this._ctx);
	            }

	            break;

	        case 2:
	            this.state = 793;
	            this.match(CParser.LeftBracket);
	            this.state = 795;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.Const || ((((_la - 37)) & ~0x1f) == 0 && ((1 << (_la - 37)) & ((1 << (CParser.Restrict - 37)) | (1 << (CParser.Volatile - 37)) | (1 << (CParser.Atomic - 37)))) !== 0)) {
	                this.state = 794;
	                this.typeQualifierList();
	            }

	            this.state = 798;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	                this.state = 797;
	                this.assignmentExpression();
	            }

	            this.state = 800;
	            this.match(CParser.RightBracket);
	            break;

	        case 3:
	            this.state = 801;
	            this.match(CParser.LeftBracket);
	            this.state = 802;
	            this.match(CParser.Static);
	            this.state = 804;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.Const || ((((_la - 37)) & ~0x1f) == 0 && ((1 << (_la - 37)) & ((1 << (CParser.Restrict - 37)) | (1 << (CParser.Volatile - 37)) | (1 << (CParser.Atomic - 37)))) !== 0)) {
	                this.state = 803;
	                this.typeQualifierList();
	            }

	            this.state = 806;
	            this.assignmentExpression();
	            this.state = 807;
	            this.match(CParser.RightBracket);
	            break;

	        case 4:
	            this.state = 809;
	            this.match(CParser.LeftBracket);
	            this.state = 810;
	            this.typeQualifierList();
	            this.state = 811;
	            this.match(CParser.Static);
	            this.state = 812;
	            this.assignmentExpression();
	            this.state = 813;
	            this.match(CParser.RightBracket);
	            break;

	        case 5:
	            this.state = 815;
	            this.match(CParser.LeftBracket);
	            this.state = 816;
	            this.match(CParser.Star);
	            this.state = 817;
	            this.match(CParser.RightBracket);
	            break;

	        case 6:
	            this.state = 818;
	            this.match(CParser.LeftParen);
	            this.state = 820;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 33)) & ~0x1f) == 0 && ((1 << (_la - 33)) & ((1 << (CParser.Inline - 33)) | (1 << (CParser.Int - 33)) | (1 << (CParser.Long - 33)) | (1 << (CParser.Register - 33)) | (1 << (CParser.Short - 33)) | (1 << (CParser.Signed - 33)) | (1 << (CParser.Static - 33)) | (1 << (CParser.Struct - 33)) | (1 << (CParser.Typedef - 33)) | (1 << (CParser.Union - 33)) | (1 << (CParser.Unsigned - 33)) | (1 << (CParser.Void - 33)) | (1 << (CParser.Alignas - 33)) | (1 << (CParser.Atomic - 33)) | (1 << (CParser.Bool - 33)) | (1 << (CParser.Complex - 33)) | (1 << (CParser.Noreturn - 33)) | (1 << (CParser.ThreadLocal - 33)))) !== 0) || _la===CParser.Identifier) {
	                this.state = 819;
	                this.parameterTypeList();
	            }

	            this.state = 822;
	            this.match(CParser.RightParen);
	            this.state = 826;
	            this._errHandler.sync(this);
	            var _alt = this._interp.adaptivePredict(this._input,95,this._ctx)
	            while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	                if(_alt===1) {
	                    this.state = 823;
	                    this.gccDeclaratorExtension(); 
	                }
	                this.state = 828;
	                this._errHandler.sync(this);
	                _alt = this._interp.adaptivePredict(this._input,95,this._ctx);
	            }

	            break;

	        }
	        this._ctx.stop = this._input.LT(-1);
	        this.state = 874;
	        this._errHandler.sync(this);
	        var _alt = this._interp.adaptivePredict(this._input,103,this._ctx)
	        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	            if(_alt===1) {
	                if(this._parseListeners!==null) {
	                    this.triggerExitRuleEvent();
	                }
	                _prevctx = localctx;
	                this.state = 872;
	                this._errHandler.sync(this);
	                var la_ = this._interp.adaptivePredict(this._input,102,this._ctx);
	                switch(la_) {
	                case 1:
	                    localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator);
	                    this.state = 831;
	                    if (!( this.precpred(this._ctx, 5))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)");
	                    }
	                    this.state = 832;
	                    this.match(CParser.LeftBracket);
	                    this.state = 834;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                    if(_la===CParser.Const || ((((_la - 37)) & ~0x1f) == 0 && ((1 << (_la - 37)) & ((1 << (CParser.Restrict - 37)) | (1 << (CParser.Volatile - 37)) | (1 << (CParser.Atomic - 37)))) !== 0)) {
	                        this.state = 833;
	                        this.typeQualifierList();
	                    }

	                    this.state = 837;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                    if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	                        this.state = 836;
	                        this.assignmentExpression();
	                    }

	                    this.state = 839;
	                    this.match(CParser.RightBracket);
	                    break;

	                case 2:
	                    localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator);
	                    this.state = 840;
	                    if (!( this.precpred(this._ctx, 4))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)");
	                    }
	                    this.state = 841;
	                    this.match(CParser.LeftBracket);
	                    this.state = 842;
	                    this.match(CParser.Static);
	                    this.state = 844;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                    if(_la===CParser.Const || ((((_la - 37)) & ~0x1f) == 0 && ((1 << (_la - 37)) & ((1 << (CParser.Restrict - 37)) | (1 << (CParser.Volatile - 37)) | (1 << (CParser.Atomic - 37)))) !== 0)) {
	                        this.state = 843;
	                        this.typeQualifierList();
	                    }

	                    this.state = 846;
	                    this.assignmentExpression();
	                    this.state = 847;
	                    this.match(CParser.RightBracket);
	                    break;

	                case 3:
	                    localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator);
	                    this.state = 849;
	                    if (!( this.precpred(this._ctx, 3))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)");
	                    }
	                    this.state = 850;
	                    this.match(CParser.LeftBracket);
	                    this.state = 851;
	                    this.typeQualifierList();
	                    this.state = 852;
	                    this.match(CParser.Static);
	                    this.state = 853;
	                    this.assignmentExpression();
	                    this.state = 854;
	                    this.match(CParser.RightBracket);
	                    break;

	                case 4:
	                    localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator);
	                    this.state = 856;
	                    if (!( this.precpred(this._ctx, 2))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)");
	                    }
	                    this.state = 857;
	                    this.match(CParser.LeftBracket);
	                    this.state = 858;
	                    this.match(CParser.Star);
	                    this.state = 859;
	                    this.match(CParser.RightBracket);
	                    break;

	                case 5:
	                    localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState);
	                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator);
	                    this.state = 860;
	                    if (!( this.precpred(this._ctx, 1))) {
	                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
	                    }
	                    this.state = 861;
	                    this.match(CParser.LeftParen);
	                    this.state = 863;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                    if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float))) !== 0) || ((((_la - 33)) & ~0x1f) == 0 && ((1 << (_la - 33)) & ((1 << (CParser.Inline - 33)) | (1 << (CParser.Int - 33)) | (1 << (CParser.Long - 33)) | (1 << (CParser.Register - 33)) | (1 << (CParser.Short - 33)) | (1 << (CParser.Signed - 33)) | (1 << (CParser.Static - 33)) | (1 << (CParser.Struct - 33)) | (1 << (CParser.Typedef - 33)) | (1 << (CParser.Union - 33)) | (1 << (CParser.Unsigned - 33)) | (1 << (CParser.Void - 33)) | (1 << (CParser.Alignas - 33)) | (1 << (CParser.Atomic - 33)) | (1 << (CParser.Bool - 33)) | (1 << (CParser.Complex - 33)) | (1 << (CParser.Noreturn - 33)) | (1 << (CParser.ThreadLocal - 33)))) !== 0) || _la===CParser.Identifier) {
	                        this.state = 862;
	                        this.parameterTypeList();
	                    }

	                    this.state = 865;
	                    this.match(CParser.RightParen);
	                    this.state = 869;
	                    this._errHandler.sync(this);
	                    var _alt = this._interp.adaptivePredict(this._input,101,this._ctx)
	                    while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	                        if(_alt===1) {
	                            this.state = 866;
	                            this.gccDeclaratorExtension(); 
	                        }
	                        this.state = 871;
	                        this._errHandler.sync(this);
	                        _alt = this._interp.adaptivePredict(this._input,101,this._ctx);
	                    }

	                    break;

	                } 
	            }
	            this.state = 876;
	            this._errHandler.sync(this);
	            _alt = this._interp.adaptivePredict(this._input,103,this._ctx);
	        }

	    } catch( error) {
	        if(error instanceof antlr4.error.RecognitionException) {
		        localctx.exception = error;
		        this._errHandler.reportError(this, error);
		        this._errHandler.recover(this, error);
		    } else {
		    	throw error;
		    }
	    } finally {
	        this.unrollRecursionContexts(_parentctx)
	    }
	    return localctx;
	}



	gccDeclaratorExtension() {
	    let localctx = new GccDeclaratorExtensionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 132, CParser.RULE_gccDeclaratorExtension);
	    var _la = 0; // Token type
	    try {
	        this.state = 886;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.T__11:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 877;
	            this.match(CParser.T__11);
	            this.state = 878;
	            this.match(CParser.LeftParen);
	            this.state = 880; 
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            do {
	                this.state = 879;
	                this.match(CParser.StringLiteral);
	                this.state = 882; 
	                this._errHandler.sync(this);
	                _la = this._input.LA(1);
	            } while(_la===CParser.StringLiteral);
	            this.state = 884;
	            this.match(CParser.RightParen);
	            break;
	        case CParser.T__8:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 885;
	            this.gccAttributeSpecifier();
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	idName() {
	    let localctx = new IdNameContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 134, CParser.RULE_idName);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 888;
	        this.match(CParser.Identifier);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	identifierList() {
	    let localctx = new IdentifierListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 136, CParser.RULE_identifierList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 890;
	        this.match(CParser.Identifier);
	        this.state = 895;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Comma) {
	            this.state = 891;
	            this.match(CParser.Comma);
	            this.state = 892;
	            this.match(CParser.Identifier);
	            this.state = 897;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	initializer() {
	    let localctx = new InitializerContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 138, CParser.RULE_initializer);
	    var _la = 0; // Token type
	    try {
	        this.state = 906;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.T__3:
	        case CParser.T__9:
	        case CParser.T__10:
	        case CParser.Constant:
	        case CParser.StringLiteral:
	        case CParser.Sizeof:
	        case CParser.Alignof:
	        case CParser.Generic:
	        case CParser.LeftParen:
	        case CParser.Plus:
	        case CParser.PlusPlus:
	        case CParser.Minus:
	        case CParser.MinusMinus:
	        case CParser.Star:
	        case CParser.And:
	        case CParser.AndAnd:
	        case CParser.Not:
	        case CParser.Tilde:
	        case CParser.Identifier:
	        case CParser.DigitSequence:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 898;
	            this.assignmentExpression();
	            break;
	        case CParser.LeftBrace:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 899;
	            this.match(CParser.LeftBrace);
	            this.state = 900;
	            this.initializerList();
	            this.state = 902;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if(_la===CParser.Comma) {
	                this.state = 901;
	                this.match(CParser.Comma);
	            }

	            this.state = 904;
	            this.match(CParser.RightBrace);
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	initializerList() {
	    let localctx = new InitializerListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 140, CParser.RULE_initializerList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 909;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if(_la===CParser.LeftBracket || _la===CParser.Dot) {
	            this.state = 908;
	            this.designation();
	        }

	        this.state = 911;
	        this.initializer();
	        this.state = 919;
	        this._errHandler.sync(this);
	        var _alt = this._interp.adaptivePredict(this._input,111,this._ctx)
	        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
	            if(_alt===1) {
	                this.state = 912;
	                this.match(CParser.Comma);
	                this.state = 914;
	                this._errHandler.sync(this);
	                _la = this._input.LA(1);
	                if(_la===CParser.LeftBracket || _la===CParser.Dot) {
	                    this.state = 913;
	                    this.designation();
	                }

	                this.state = 916;
	                this.initializer(); 
	            }
	            this.state = 921;
	            this._errHandler.sync(this);
	            _alt = this._interp.adaptivePredict(this._input,111,this._ctx);
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	designation() {
	    let localctx = new DesignationContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 142, CParser.RULE_designation);
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 922;
	        this.designatorList();
	        this.state = 923;
	        this.match(CParser.Assign);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	designatorList() {
	    let localctx = new DesignatorListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 144, CParser.RULE_designatorList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 926; 
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        do {
	            this.state = 925;
	            this.designator();
	            this.state = 928; 
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        } while(_la===CParser.LeftBracket || _la===CParser.Dot);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	designator() {
	    let localctx = new DesignatorContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 146, CParser.RULE_designator);
	    try {
	        this.state = 936;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.LeftBracket:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 930;
	            this.match(CParser.LeftBracket);
	            this.state = 931;
	            this.constantExpression();
	            this.state = 932;
	            this.match(CParser.RightBracket);
	            break;
	        case CParser.Dot:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 934;
	            this.match(CParser.Dot);
	            this.state = 935;
	            this.match(CParser.Identifier);
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	statement() {
	    let localctx = new StatementContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 148, CParser.RULE_statement);
	    var _la = 0; // Token type
	    try {
	        this.state = 975;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,119,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 938;
	            this.labeledStatement();
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 939;
	            this.compoundStatement();
	            break;

	        case 3:
	            this.enterOuterAlt(localctx, 3);
	            this.state = 940;
	            this.expressionStatement();
	            break;

	        case 4:
	            this.enterOuterAlt(localctx, 4);
	            this.state = 941;
	            this.selectionStatement();
	            break;

	        case 5:
	            this.enterOuterAlt(localctx, 5);
	            this.state = 942;
	            this.iterationStatement();
	            break;

	        case 6:
	            this.enterOuterAlt(localctx, 6);
	            this.state = 943;
	            this.jumpStatement();
	            break;

	        case 7:
	            this.enterOuterAlt(localctx, 7);
	            this.state = 944;
	            _la = this._input.LA(1);
	            if(!(_la===CParser.T__11 || _la===CParser.T__12)) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            this.state = 945;
	            _la = this._input.LA(1);
	            if(!(_la===CParser.T__13 || _la===CParser.Volatile)) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            this.state = 946;
	            this.match(CParser.LeftParen);
	            this.state = 955;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	                this.state = 947;
	                this.logicalOrExpression();
	                this.state = 952;
	                this._errHandler.sync(this);
	                _la = this._input.LA(1);
	                while(_la===CParser.Comma) {
	                    this.state = 948;
	                    this.match(CParser.Comma);
	                    this.state = 949;
	                    this.logicalOrExpression();
	                    this.state = 954;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                }
	            }

	            this.state = 970;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            while(_la===CParser.Colon) {
	                this.state = 957;
	                this.match(CParser.Colon);
	                this.state = 966;
	                this._errHandler.sync(this);
	                _la = this._input.LA(1);
	                if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	                    this.state = 958;
	                    this.logicalOrExpression();
	                    this.state = 963;
	                    this._errHandler.sync(this);
	                    _la = this._input.LA(1);
	                    while(_la===CParser.Comma) {
	                        this.state = 959;
	                        this.match(CParser.Comma);
	                        this.state = 960;
	                        this.logicalOrExpression();
	                        this.state = 965;
	                        this._errHandler.sync(this);
	                        _la = this._input.LA(1);
	                    }
	                }

	                this.state = 972;
	                this._errHandler.sync(this);
	                _la = this._input.LA(1);
	            }
	            this.state = 973;
	            this.match(CParser.RightParen);
	            this.state = 974;
	            this.match(CParser.Semi);
	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	nestedParenthesesBlock() {
	    let localctx = new NestedParenthesesBlockContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 150, CParser.RULE_nestedParenthesesBlock);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 984;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Constant) | (1 << CParser.StringLiteral) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.If - 32)) | (1 << (CParser.Inline - 32)) | (1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBracket - 64)) | (1 << (CParser.LeftBrace - 64)) | (1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.MinusAssign - 96)) | (1 << (CParser.LeftShiftAssign - 96)) | (1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.DigitSequence - 96)) | (1 << (CParser.IfDefine - 96)) | (1 << (CParser.IfNDefine - 96)) | (1 << (CParser.EndIfDefine - 96)) | (1 << (CParser.AsmBlock - 96)) | (1 << (CParser.LineAfterPreprocessing - 96)) | (1 << (CParser.LineDirective - 96)) | (1 << (CParser.PragmaDirective - 96)) | (1 << (CParser.ComplexDefine - 96)) | (1 << (CParser.IncludeDirective - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) {
	            this.state = 982;
	            this._errHandler.sync(this);
	            switch(this._input.LA(1)) {
	            case CParser.T__0:
	            case CParser.T__1:
	            case CParser.T__2:
	            case CParser.T__3:
	            case CParser.T__4:
	            case CParser.T__5:
	            case CParser.T__6:
	            case CParser.T__7:
	            case CParser.T__8:
	            case CParser.T__9:
	            case CParser.T__10:
	            case CParser.T__11:
	            case CParser.T__12:
	            case CParser.T__13:
	            case CParser.Constant:
	            case CParser.StringLiteral:
	            case CParser.Auto:
	            case CParser.Break:
	            case CParser.Case:
	            case CParser.Char:
	            case CParser.Const:
	            case CParser.Continue:
	            case CParser.Default:
	            case CParser.Do:
	            case CParser.Double:
	            case CParser.Else:
	            case CParser.Enum:
	            case CParser.Extern:
	            case CParser.Float:
	            case CParser.For:
	            case CParser.Goto:
	            case CParser.If:
	            case CParser.Inline:
	            case CParser.Int:
	            case CParser.Long:
	            case CParser.Register:
	            case CParser.Restrict:
	            case CParser.Return:
	            case CParser.Short:
	            case CParser.Signed:
	            case CParser.Sizeof:
	            case CParser.Static:
	            case CParser.Struct:
	            case CParser.Switch:
	            case CParser.Typedef:
	            case CParser.Union:
	            case CParser.Unsigned:
	            case CParser.Void:
	            case CParser.Volatile:
	            case CParser.While:
	            case CParser.Alignas:
	            case CParser.Alignof:
	            case CParser.Atomic:
	            case CParser.Bool:
	            case CParser.Complex:
	            case CParser.Generic:
	            case CParser.Imaginary:
	            case CParser.Noreturn:
	            case CParser.StaticAssert:
	            case CParser.ThreadLocal:
	            case CParser.LeftBracket:
	            case CParser.RightBracket:
	            case CParser.LeftBrace:
	            case CParser.RightBrace:
	            case CParser.Less:
	            case CParser.LessEqual:
	            case CParser.Greater:
	            case CParser.GreaterEqual:
	            case CParser.LeftShift:
	            case CParser.RightShift:
	            case CParser.Plus:
	            case CParser.PlusPlus:
	            case CParser.Minus:
	            case CParser.MinusMinus:
	            case CParser.Star:
	            case CParser.Div:
	            case CParser.Mod:
	            case CParser.And:
	            case CParser.Or:
	            case CParser.AndAnd:
	            case CParser.OrOr:
	            case CParser.Caret:
	            case CParser.Not:
	            case CParser.Tilde:
	            case CParser.Question:
	            case CParser.Colon:
	            case CParser.Semi:
	            case CParser.Comma:
	            case CParser.Assign:
	            case CParser.StarAssign:
	            case CParser.DivAssign:
	            case CParser.ModAssign:
	            case CParser.PlusAssign:
	            case CParser.MinusAssign:
	            case CParser.LeftShiftAssign:
	            case CParser.RightShiftAssign:
	            case CParser.AndAssign:
	            case CParser.XorAssign:
	            case CParser.OrAssign:
	            case CParser.Equal:
	            case CParser.NotEqual:
	            case CParser.Arrow:
	            case CParser.Dot:
	            case CParser.Ellipsis:
	            case CParser.Identifier:
	            case CParser.DigitSequence:
	            case CParser.IfDefine:
	            case CParser.IfNDefine:
	            case CParser.EndIfDefine:
	            case CParser.AsmBlock:
	            case CParser.LineAfterPreprocessing:
	            case CParser.LineDirective:
	            case CParser.PragmaDirective:
	            case CParser.ComplexDefine:
	            case CParser.IncludeDirective:
	            case CParser.Whitespace:
	            case CParser.Newline:
	            case CParser.BlockComment:
	            case CParser.LineComment:
	                this.state = 977;
	                _la = this._input.LA(1);
	                if(_la<=0 || _la===CParser.LeftParen || _la===CParser.RightParen) {
	                this._errHandler.recoverInline(this);
	                }
	                else {
	                	this._errHandler.reportMatch(this);
	                    this.consume();
	                }
	                break;
	            case CParser.LeftParen:
	                this.state = 978;
	                this.match(CParser.LeftParen);
	                this.state = 979;
	                this.nestedParenthesesBlock();
	                this.state = 980;
	                this.match(CParser.RightParen);
	                break;
	            default:
	                throw new antlr4.error.NoViableAltException(this);
	            }
	            this.state = 986;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	labeledStatement() {
	    let localctx = new LabeledStatementContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 152, CParser.RULE_labeledStatement);
	    try {
	        this.state = 998;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.Identifier:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 987;
	            this.match(CParser.Identifier);
	            this.state = 988;
	            this.match(CParser.Colon);
	            this.state = 989;
	            this.statement();
	            break;
	        case CParser.Case:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 990;
	            this.match(CParser.Case);
	            this.state = 991;
	            this.constantExpression();
	            this.state = 992;
	            this.match(CParser.Colon);
	            this.state = 993;
	            this.statement();
	            break;
	        case CParser.Default:
	            this.enterOuterAlt(localctx, 3);
	            this.state = 995;
	            this.match(CParser.Default);
	            this.state = 996;
	            this.match(CParser.Colon);
	            this.state = 997;
	            this.statement();
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	compoundStatement() {
	    let localctx = new CompoundStatementContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 154, CParser.RULE_compoundStatement);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 1000;
	        this.match(CParser.LeftBrace);
	        this.state = 1002;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.Constant) | (1 << CParser.StringLiteral) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.If - 32)) | (1 << (CParser.Inline - 32)) | (1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 65)) & ~0x1f) == 0 && ((1 << (_la - 65)) & ((1 << (CParser.LeftBrace - 65)) | (1 << (CParser.Plus - 65)) | (1 << (CParser.PlusPlus - 65)) | (1 << (CParser.Minus - 65)) | (1 << (CParser.MinusMinus - 65)) | (1 << (CParser.Star - 65)) | (1 << (CParser.And - 65)) | (1 << (CParser.AndAnd - 65)) | (1 << (CParser.Not - 65)) | (1 << (CParser.Tilde - 65)) | (1 << (CParser.Semi - 65)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	            this.state = 1001;
	            this.blockItemList();
	        }

	        this.state = 1004;
	        this.match(CParser.RightBrace);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	expressionStatement() {
	    let localctx = new ExpressionStatementContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 156, CParser.RULE_expressionStatement);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 1007;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	            this.state = 1006;
	            this.expression();
	        }

	        this.state = 1009;
	        this.match(CParser.Semi);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	selectionStatement() {
	    let localctx = new SelectionStatementContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 158, CParser.RULE_selectionStatement);
	    try {
	        this.state = 1026;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.If:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 1011;
	            this.match(CParser.If);
	            this.state = 1012;
	            this.match(CParser.LeftParen);
	            this.state = 1013;
	            this.expression();
	            this.state = 1014;
	            this.match(CParser.RightParen);
	            this.state = 1015;
	            this.statement();
	            this.state = 1018;
	            this._errHandler.sync(this);
	            var la_ = this._interp.adaptivePredict(this._input,125,this._ctx);
	            if(la_===1) {
	                this.state = 1016;
	                this.match(CParser.Else);
	                this.state = 1017;
	                this.statement();

	            }
	            break;
	        case CParser.Switch:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 1020;
	            this.match(CParser.Switch);
	            this.state = 1021;
	            this.match(CParser.LeftParen);
	            this.state = 1022;
	            this.expression();
	            this.state = 1023;
	            this.match(CParser.RightParen);
	            this.state = 1024;
	            this.statement();
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	iterationStatement() {
	    let localctx = new IterationStatementContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 160, CParser.RULE_iterationStatement);
	    try {
	        this.state = 1048;
	        this._errHandler.sync(this);
	        switch(this._input.LA(1)) {
	        case CParser.While:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 1028;
	            this.match(CParser.While);
	            this.state = 1029;
	            this.match(CParser.LeftParen);
	            this.state = 1030;
	            this.expression();
	            this.state = 1031;
	            this.match(CParser.RightParen);
	            this.state = 1032;
	            this.statement();
	            break;
	        case CParser.Do:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 1034;
	            this.match(CParser.Do);
	            this.state = 1035;
	            this.statement();
	            this.state = 1036;
	            this.match(CParser.While);
	            this.state = 1037;
	            this.match(CParser.LeftParen);
	            this.state = 1038;
	            this.expression();
	            this.state = 1039;
	            this.match(CParser.RightParen);
	            this.state = 1040;
	            this.match(CParser.Semi);
	            break;
	        case CParser.For:
	            this.enterOuterAlt(localctx, 3);
	            this.state = 1042;
	            this.match(CParser.For);
	            this.state = 1043;
	            this.match(CParser.LeftParen);
	            this.state = 1044;
	            this.forCondition();
	            this.state = 1045;
	            this.match(CParser.RightParen);
	            this.state = 1046;
	            this.statement();
	            break;
	        default:
	            throw new antlr4.error.NoViableAltException(this);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	forCondition() {
	    let localctx = new ForConditionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 162, CParser.RULE_forCondition);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 1054;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,129,this._ctx);
	        switch(la_) {
	        case 1:
	            this.state = 1050;
	            this.forDeclaration();
	            break;

	        case 2:
	            this.state = 1052;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	                this.state = 1051;
	                this.expression();
	            }

	            break;

	        }
	        this.state = 1056;
	        this.match(CParser.Semi);
	        this.state = 1058;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	            this.state = 1057;
	            this.forExpression();
	        }

	        this.state = 1060;
	        this.match(CParser.Semi);
	        this.state = 1062;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	            this.state = 1061;
	            this.forExpression();
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	forDeclaration() {
	    let localctx = new ForDeclarationContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 164, CParser.RULE_forDeclaration);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 1064;
	        this.declarationSpecifiers();
	        this.state = 1066;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        if(((((_la - 61)) & ~0x1f) == 0 && ((1 << (_la - 61)) & ((1 << (CParser.LeftParen - 61)) | (1 << (CParser.Star - 61)) | (1 << (CParser.Caret - 61)))) !== 0) || ((((_la - 107)) & ~0x1f) == 0 && ((1 << (_la - 107)) & ((1 << (CParser.Identifier - 107)) | (1 << (CParser.IfDefine - 107)) | (1 << (CParser.EndIfDefine - 107)) | (1 << (CParser.ComplexDefine - 107)))) !== 0)) {
	            this.state = 1065;
	            this.initDeclaratorList();
	        }

	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	forExpression() {
	    let localctx = new ForExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 166, CParser.RULE_forExpression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 1068;
	        this.assignmentExpression();
	        this.state = 1073;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Comma) {
	            this.state = 1069;
	            this.match(CParser.Comma);
	            this.state = 1070;
	            this.assignmentExpression();
	            this.state = 1075;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	jumpStatement() {
	    let localctx = new JumpStatementContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 168, CParser.RULE_jumpStatement);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 1085;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,135,this._ctx);
	        switch(la_) {
	        case 1:
	            this.state = 1076;
	            this.match(CParser.Goto);
	            this.state = 1077;
	            this.match(CParser.Identifier);
	            break;

	        case 2:
	            this.state = 1078;
	            _la = this._input.LA(1);
	            if(!(_la===CParser.Break || _la===CParser.Continue)) {
	            this._errHandler.recoverInline(this);
	            }
	            else {
	            	this._errHandler.reportMatch(this);
	                this.consume();
	            }
	            break;

	        case 3:
	            this.state = 1079;
	            this.match(CParser.Return);
	            this.state = 1081;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.Constant) | (1 << CParser.StringLiteral))) !== 0) || ((((_la - 41)) & ~0x1f) == 0 && ((1 << (_la - 41)) & ((1 << (CParser.Sizeof - 41)) | (1 << (CParser.Alignof - 41)) | (1 << (CParser.Generic - 41)) | (1 << (CParser.LeftParen - 41)))) !== 0) || ((((_la - 73)) & ~0x1f) == 0 && ((1 << (_la - 73)) & ((1 << (CParser.Plus - 73)) | (1 << (CParser.PlusPlus - 73)) | (1 << (CParser.Minus - 73)) | (1 << (CParser.MinusMinus - 73)) | (1 << (CParser.Star - 73)) | (1 << (CParser.And - 73)) | (1 << (CParser.AndAnd - 73)) | (1 << (CParser.Not - 73)) | (1 << (CParser.Tilde - 73)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence) {
	                this.state = 1080;
	                this.expression();
	            }

	            break;

	        case 4:
	            this.state = 1083;
	            this.match(CParser.Goto);
	            this.state = 1084;
	            this.unaryExpression();
	            break;

	        }
	        this.state = 1087;
	        this.match(CParser.Semi);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	expression() {
	    let localctx = new ExpressionContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 170, CParser.RULE_expression);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 1089;
	        this.assignmentExpression();
	        this.state = 1094;
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        while(_la===CParser.Comma) {
	            this.state = 1090;
	            this.match(CParser.Comma);
	            this.state = 1091;
	            this.assignmentExpression();
	            this.state = 1096;
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	blockItemList() {
	    let localctx = new BlockItemListContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 172, CParser.RULE_blockItemList);
	    var _la = 0; // Token type
	    try {
	        this.enterOuterAlt(localctx, 1);
	        this.state = 1098; 
	        this._errHandler.sync(this);
	        _la = this._input.LA(1);
	        do {
	            this.state = 1097;
	            this.blockItem();
	            this.state = 1100; 
	            this._errHandler.sync(this);
	            _la = this._input.LA(1);
	        } while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.Constant) | (1 << CParser.StringLiteral) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.If - 32)) | (1 << (CParser.Inline - 32)) | (1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 65)) & ~0x1f) == 0 && ((1 << (_la - 65)) & ((1 << (CParser.LeftBrace - 65)) | (1 << (CParser.Plus - 65)) | (1 << (CParser.PlusPlus - 65)) | (1 << (CParser.Minus - 65)) | (1 << (CParser.MinusMinus - 65)) | (1 << (CParser.Star - 65)) | (1 << (CParser.And - 65)) | (1 << (CParser.AndAnd - 65)) | (1 << (CParser.Not - 65)) | (1 << (CParser.Tilde - 65)) | (1 << (CParser.Semi - 65)))) !== 0) || _la===CParser.Identifier || _la===CParser.DigitSequence);
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}



	blockItem() {
	    let localctx = new BlockItemContext(this, this._ctx, this.state);
	    this.enterRule(localctx, 174, CParser.RULE_blockItem);
	    try {
	        this.state = 1104;
	        this._errHandler.sync(this);
	        var la_ = this._interp.adaptivePredict(this._input,138,this._ctx);
	        switch(la_) {
	        case 1:
	            this.enterOuterAlt(localctx, 1);
	            this.state = 1102;
	            this.statement();
	            break;

	        case 2:
	            this.enterOuterAlt(localctx, 2);
	            this.state = 1103;
	            this.declaration();
	            break;

	        }
	    } catch (re) {
	    	if(re instanceof antlr4.error.RecognitionException) {
		        localctx.exception = re;
		        this._errHandler.reportError(this, re);
		        this._errHandler.recover(this, re);
		    } else {
		    	throw re;
		    }
	    } finally {
	        this.exitRule();
	    }
	    return localctx;
	}


}

CParser.EOF = antlr4.Token.EOF;
CParser.T__0 = 1;
CParser.T__1 = 2;
CParser.T__2 = 3;
CParser.T__3 = 4;
CParser.T__4 = 5;
CParser.T__5 = 6;
CParser.T__6 = 7;
CParser.T__7 = 8;
CParser.T__8 = 9;
CParser.T__9 = 10;
CParser.T__10 = 11;
CParser.T__11 = 12;
CParser.T__12 = 13;
CParser.T__13 = 14;
CParser.Constant = 15;
CParser.StringLiteral = 16;
CParser.Auto = 17;
CParser.Break = 18;
CParser.Case = 19;
CParser.Char = 20;
CParser.Const = 21;
CParser.Continue = 22;
CParser.Default = 23;
CParser.Do = 24;
CParser.Double = 25;
CParser.Else = 26;
CParser.Enum = 27;
CParser.Extern = 28;
CParser.Float = 29;
CParser.For = 30;
CParser.Goto = 31;
CParser.If = 32;
CParser.Inline = 33;
CParser.Int = 34;
CParser.Long = 35;
CParser.Register = 36;
CParser.Restrict = 37;
CParser.Return = 38;
CParser.Short = 39;
CParser.Signed = 40;
CParser.Sizeof = 41;
CParser.Static = 42;
CParser.Struct = 43;
CParser.Switch = 44;
CParser.Typedef = 45;
CParser.Union = 46;
CParser.Unsigned = 47;
CParser.Void = 48;
CParser.Volatile = 49;
CParser.While = 50;
CParser.Alignas = 51;
CParser.Alignof = 52;
CParser.Atomic = 53;
CParser.Bool = 54;
CParser.Complex = 55;
CParser.Generic = 56;
CParser.Imaginary = 57;
CParser.Noreturn = 58;
CParser.StaticAssert = 59;
CParser.ThreadLocal = 60;
CParser.LeftParen = 61;
CParser.RightParen = 62;
CParser.LeftBracket = 63;
CParser.RightBracket = 64;
CParser.LeftBrace = 65;
CParser.RightBrace = 66;
CParser.Less = 67;
CParser.LessEqual = 68;
CParser.Greater = 69;
CParser.GreaterEqual = 70;
CParser.LeftShift = 71;
CParser.RightShift = 72;
CParser.Plus = 73;
CParser.PlusPlus = 74;
CParser.Minus = 75;
CParser.MinusMinus = 76;
CParser.Star = 77;
CParser.Div = 78;
CParser.Mod = 79;
CParser.And = 80;
CParser.Or = 81;
CParser.AndAnd = 82;
CParser.OrOr = 83;
CParser.Caret = 84;
CParser.Not = 85;
CParser.Tilde = 86;
CParser.Question = 87;
CParser.Colon = 88;
CParser.Semi = 89;
CParser.Comma = 90;
CParser.Assign = 91;
CParser.StarAssign = 92;
CParser.DivAssign = 93;
CParser.ModAssign = 94;
CParser.PlusAssign = 95;
CParser.MinusAssign = 96;
CParser.LeftShiftAssign = 97;
CParser.RightShiftAssign = 98;
CParser.AndAssign = 99;
CParser.XorAssign = 100;
CParser.OrAssign = 101;
CParser.Equal = 102;
CParser.NotEqual = 103;
CParser.Arrow = 104;
CParser.Dot = 105;
CParser.Ellipsis = 106;
CParser.Identifier = 107;
CParser.DigitSequence = 108;
CParser.IfDefine = 109;
CParser.IfNDefine = 110;
CParser.EndIfDefine = 111;
CParser.AsmBlock = 112;
CParser.LineAfterPreprocessing = 113;
CParser.LineDirective = 114;
CParser.PragmaDirective = 115;
CParser.ComplexDefine = 116;
CParser.IncludeDirective = 117;
CParser.Whitespace = 118;
CParser.Newline = 119;
CParser.BlockComment = 120;
CParser.LineComment = 121;

CParser.RULE_compilationUnit = 0;
CParser.RULE_translationUnit = 1;
CParser.RULE_externalDeclaration = 2;
CParser.RULE_functionDefinition = 3;
CParser.RULE_declarationList = 4;
CParser.RULE_declaration = 5;
CParser.RULE_declarationSpecifiers = 6;
CParser.RULE_initDeclaratorList = 7;
CParser.RULE_initDeclarator = 8;
CParser.RULE_staticAssertDeclaration = 9;
CParser.RULE_declarationSpecifier = 10;
CParser.RULE_storageClassSpecifier = 11;
CParser.RULE_typeSpecifier = 12;
CParser.RULE_atomicTypeSpecifier = 13;
CParser.RULE_typeName = 14;
CParser.RULE_structOrUnionSpecifier = 15;
CParser.RULE_structOrUnion = 16;
CParser.RULE_structDeclarationList = 17;
CParser.RULE_structDeclaration = 18;
CParser.RULE_specifierQualifierList = 19;
CParser.RULE_structDeclaratorList = 20;
CParser.RULE_structDeclarator = 21;
CParser.RULE_enumSpecifier = 22;
CParser.RULE_enumeratorList = 23;
CParser.RULE_enumerator = 24;
CParser.RULE_enumerationConstant = 25;
CParser.RULE_typedefName = 26;
CParser.RULE_constantExpression = 27;
CParser.RULE_pointer = 28;
CParser.RULE_typeQualifier = 29;
CParser.RULE_functionSpecifier = 30;
CParser.RULE_gccAttributeSpecifier = 31;
CParser.RULE_gccAttributeList = 32;
CParser.RULE_gccAttribute = 33;
CParser.RULE_alignmentSpecifier = 34;
CParser.RULE_declarator = 35;
CParser.RULE_directDeclarator = 36;
CParser.RULE_typeQualifierList = 37;
CParser.RULE_assignmentExpression = 38;
CParser.RULE_conditionalExpression = 39;
CParser.RULE_logicalOrExpression = 40;
CParser.RULE_logicalAndExpression = 41;
CParser.RULE_inclusiveOrExpression = 42;
CParser.RULE_exclusiveOrExpression = 43;
CParser.RULE_andExpression = 44;
CParser.RULE_equalityExpression = 45;
CParser.RULE_relationalExpression = 46;
CParser.RULE_shiftExpression = 47;
CParser.RULE_additiveExpression = 48;
CParser.RULE_multiplicativeExpression = 49;
CParser.RULE_castExpression = 50;
CParser.RULE_unaryExpression = 51;
CParser.RULE_postfixExpression = 52;
CParser.RULE_primaryExpression = 53;
CParser.RULE_genericSelection = 54;
CParser.RULE_genericAssocList = 55;
CParser.RULE_genericAssociation = 56;
CParser.RULE_argumentExpressionList = 57;
CParser.RULE_unaryOperator = 58;
CParser.RULE_assignmentOperator = 59;
CParser.RULE_parameterTypeList = 60;
CParser.RULE_parameterList = 61;
CParser.RULE_parameterDeclaration = 62;
CParser.RULE_declarationSpecifiers2 = 63;
CParser.RULE_abstractDeclarator = 64;
CParser.RULE_directAbstractDeclarator = 65;
CParser.RULE_gccDeclaratorExtension = 66;
CParser.RULE_idName = 67;
CParser.RULE_identifierList = 68;
CParser.RULE_initializer = 69;
CParser.RULE_initializerList = 70;
CParser.RULE_designation = 71;
CParser.RULE_designatorList = 72;
CParser.RULE_designator = 73;
CParser.RULE_statement = 74;
CParser.RULE_nestedParenthesesBlock = 75;
CParser.RULE_labeledStatement = 76;
CParser.RULE_compoundStatement = 77;
CParser.RULE_expressionStatement = 78;
CParser.RULE_selectionStatement = 79;
CParser.RULE_iterationStatement = 80;
CParser.RULE_forCondition = 81;
CParser.RULE_forDeclaration = 82;
CParser.RULE_forExpression = 83;
CParser.RULE_jumpStatement = 84;
CParser.RULE_expression = 85;
CParser.RULE_blockItemList = 86;
CParser.RULE_blockItem = 87;

class CompilationUnitContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_compilationUnit;
    }

	EOF() {
	    return this.getToken(CParser.EOF, 0);
	};

	translationUnit() {
	    return this.getTypedRuleContext(TranslationUnitContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterCompilationUnit(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitCompilationUnit(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitCompilationUnit(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class TranslationUnitContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_translationUnit;
    }

	IncludeDirective = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.IncludeDirective);
	    } else {
	        return this.getToken(CParser.IncludeDirective, i);
	    }
	};


	externalDeclaration = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(ExternalDeclarationContext);
	    } else {
	        return this.getTypedRuleContext(ExternalDeclarationContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterTranslationUnit(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitTranslationUnit(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitTranslationUnit(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ExternalDeclarationContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_externalDeclaration;
    }

	ComplexDefine() {
	    return this.getToken(CParser.ComplexDefine, 0);
	};

	functionDefinition() {
	    return this.getTypedRuleContext(FunctionDefinitionContext,0);
	};

	declaration() {
	    return this.getTypedRuleContext(DeclarationContext,0);
	};

	Semi() {
	    return this.getToken(CParser.Semi, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterExternalDeclaration(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitExternalDeclaration(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitExternalDeclaration(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class FunctionDefinitionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_functionDefinition;
    }

	declarator() {
	    return this.getTypedRuleContext(DeclaratorContext,0);
	};

	compoundStatement() {
	    return this.getTypedRuleContext(CompoundStatementContext,0);
	};

	declarationSpecifiers() {
	    return this.getTypedRuleContext(DeclarationSpecifiersContext,0);
	};

	declarationList() {
	    return this.getTypedRuleContext(DeclarationListContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterFunctionDefinition(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitFunctionDefinition(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitFunctionDefinition(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DeclarationListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_declarationList;
    }

	declaration = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(DeclarationContext);
	    } else {
	        return this.getTypedRuleContext(DeclarationContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDeclarationList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDeclarationList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDeclarationList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DeclarationContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_declaration;
    }

	declarationSpecifiers() {
	    return this.getTypedRuleContext(DeclarationSpecifiersContext,0);
	};

	Semi() {
	    return this.getToken(CParser.Semi, 0);
	};

	initDeclaratorList() {
	    return this.getTypedRuleContext(InitDeclaratorListContext,0);
	};

	staticAssertDeclaration() {
	    return this.getTypedRuleContext(StaticAssertDeclarationContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDeclaration(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDeclaration(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDeclaration(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DeclarationSpecifiersContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_declarationSpecifiers;
    }

	declarationSpecifier = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(DeclarationSpecifierContext);
	    } else {
	        return this.getTypedRuleContext(DeclarationSpecifierContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDeclarationSpecifiers(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDeclarationSpecifiers(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDeclarationSpecifiers(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class InitDeclaratorListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_initDeclaratorList;
    }

	initDeclarator = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(InitDeclaratorContext);
	    } else {
	        return this.getTypedRuleContext(InitDeclaratorContext,i);
	    }
	};

	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterInitDeclaratorList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitInitDeclaratorList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitInitDeclaratorList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class InitDeclaratorContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_initDeclarator;
    }

	declarator() {
	    return this.getTypedRuleContext(DeclaratorContext,0);
	};

	Assign() {
	    return this.getToken(CParser.Assign, 0);
	};

	initializer() {
	    return this.getTypedRuleContext(InitializerContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterInitDeclarator(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitInitDeclarator(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitInitDeclarator(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class StaticAssertDeclarationContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_staticAssertDeclaration;
    }

	StaticAssert() {
	    return this.getToken(CParser.StaticAssert, 0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	constantExpression() {
	    return this.getTypedRuleContext(ConstantExpressionContext,0);
	};

	Comma() {
	    return this.getToken(CParser.Comma, 0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	Semi() {
	    return this.getToken(CParser.Semi, 0);
	};

	StringLiteral = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.StringLiteral);
	    } else {
	        return this.getToken(CParser.StringLiteral, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterStaticAssertDeclaration(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitStaticAssertDeclaration(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitStaticAssertDeclaration(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DeclarationSpecifierContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_declarationSpecifier;
    }

	storageClassSpecifier() {
	    return this.getTypedRuleContext(StorageClassSpecifierContext,0);
	};

	typeSpecifier() {
	    return this.getTypedRuleContext(TypeSpecifierContext,0);
	};

	functionSpecifier() {
	    return this.getTypedRuleContext(FunctionSpecifierContext,0);
	};

	alignmentSpecifier() {
	    return this.getTypedRuleContext(AlignmentSpecifierContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDeclarationSpecifier(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDeclarationSpecifier(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDeclarationSpecifier(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class StorageClassSpecifierContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_storageClassSpecifier;
    }

	Typedef() {
	    return this.getToken(CParser.Typedef, 0);
	};

	Extern() {
	    return this.getToken(CParser.Extern, 0);
	};

	Const() {
	    return this.getToken(CParser.Const, 0);
	};

	Static() {
	    return this.getToken(CParser.Static, 0);
	};

	ThreadLocal() {
	    return this.getToken(CParser.ThreadLocal, 0);
	};

	Auto() {
	    return this.getToken(CParser.Auto, 0);
	};

	Register() {
	    return this.getToken(CParser.Register, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterStorageClassSpecifier(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitStorageClassSpecifier(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitStorageClassSpecifier(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class TypeSpecifierContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_typeSpecifier;
    }

	Void() {
	    return this.getToken(CParser.Void, 0);
	};

	Char() {
	    return this.getToken(CParser.Char, 0);
	};

	Short() {
	    return this.getToken(CParser.Short, 0);
	};

	Int() {
	    return this.getToken(CParser.Int, 0);
	};

	Long() {
	    return this.getToken(CParser.Long, 0);
	};

	Float() {
	    return this.getToken(CParser.Float, 0);
	};

	Double() {
	    return this.getToken(CParser.Double, 0);
	};

	Signed() {
	    return this.getToken(CParser.Signed, 0);
	};

	Unsigned() {
	    return this.getToken(CParser.Unsigned, 0);
	};

	Bool() {
	    return this.getToken(CParser.Bool, 0);
	};

	Complex() {
	    return this.getToken(CParser.Complex, 0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	atomicTypeSpecifier() {
	    return this.getTypedRuleContext(AtomicTypeSpecifierContext,0);
	};

	structOrUnionSpecifier() {
	    return this.getTypedRuleContext(StructOrUnionSpecifierContext,0);
	};

	enumSpecifier() {
	    return this.getTypedRuleContext(EnumSpecifierContext,0);
	};

	typedefName() {
	    return this.getTypedRuleContext(TypedefNameContext,0);
	};

	constantExpression() {
	    return this.getTypedRuleContext(ConstantExpressionContext,0);
	};

	typeSpecifier() {
	    return this.getTypedRuleContext(TypeSpecifierContext,0);
	};

	pointer() {
	    return this.getTypedRuleContext(PointerContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterTypeSpecifier(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitTypeSpecifier(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitTypeSpecifier(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class AtomicTypeSpecifierContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_atomicTypeSpecifier;
    }

	Atomic() {
	    return this.getToken(CParser.Atomic, 0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	typeName() {
	    return this.getTypedRuleContext(TypeNameContext,0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterAtomicTypeSpecifier(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitAtomicTypeSpecifier(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitAtomicTypeSpecifier(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class TypeNameContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_typeName;
    }

	specifierQualifierList() {
	    return this.getTypedRuleContext(SpecifierQualifierListContext,0);
	};

	abstractDeclarator() {
	    return this.getTypedRuleContext(AbstractDeclaratorContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterTypeName(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitTypeName(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitTypeName(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class StructOrUnionSpecifierContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_structOrUnionSpecifier;
    }

	structOrUnion() {
	    return this.getTypedRuleContext(StructOrUnionContext,0);
	};

	LeftBrace() {
	    return this.getToken(CParser.LeftBrace, 0);
	};

	structDeclarationList() {
	    return this.getTypedRuleContext(StructDeclarationListContext,0);
	};

	RightBrace() {
	    return this.getToken(CParser.RightBrace, 0);
	};

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterStructOrUnionSpecifier(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitStructOrUnionSpecifier(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitStructOrUnionSpecifier(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class StructOrUnionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_structOrUnion;
    }

	Struct() {
	    return this.getToken(CParser.Struct, 0);
	};

	Union() {
	    return this.getToken(CParser.Union, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterStructOrUnion(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitStructOrUnion(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitStructOrUnion(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class StructDeclarationListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_structDeclarationList;
    }

	structDeclaration = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(StructDeclarationContext);
	    } else {
	        return this.getTypedRuleContext(StructDeclarationContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterStructDeclarationList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitStructDeclarationList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitStructDeclarationList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class StructDeclarationContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_structDeclaration;
    }

	specifierQualifierList() {
	    return this.getTypedRuleContext(SpecifierQualifierListContext,0);
	};

	Semi() {
	    return this.getToken(CParser.Semi, 0);
	};

	structDeclaratorList() {
	    return this.getTypedRuleContext(StructDeclaratorListContext,0);
	};

	staticAssertDeclaration() {
	    return this.getTypedRuleContext(StaticAssertDeclarationContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterStructDeclaration(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitStructDeclaration(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitStructDeclaration(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class SpecifierQualifierListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_specifierQualifierList;
    }

	typeSpecifier() {
	    return this.getTypedRuleContext(TypeSpecifierContext,0);
	};

	typeQualifier() {
	    return this.getTypedRuleContext(TypeQualifierContext,0);
	};

	specifierQualifierList() {
	    return this.getTypedRuleContext(SpecifierQualifierListContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterSpecifierQualifierList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitSpecifierQualifierList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitSpecifierQualifierList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class StructDeclaratorListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_structDeclaratorList;
    }

	structDeclarator = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(StructDeclaratorContext);
	    } else {
	        return this.getTypedRuleContext(StructDeclaratorContext,i);
	    }
	};

	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterStructDeclaratorList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitStructDeclaratorList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitStructDeclaratorList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class StructDeclaratorContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_structDeclarator;
    }

	declarator() {
	    return this.getTypedRuleContext(DeclaratorContext,0);
	};

	Colon() {
	    return this.getToken(CParser.Colon, 0);
	};

	constantExpression() {
	    return this.getTypedRuleContext(ConstantExpressionContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterStructDeclarator(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitStructDeclarator(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitStructDeclarator(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class EnumSpecifierContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_enumSpecifier;
    }

	Enum() {
	    return this.getToken(CParser.Enum, 0);
	};

	LeftBrace() {
	    return this.getToken(CParser.LeftBrace, 0);
	};

	enumeratorList() {
	    return this.getTypedRuleContext(EnumeratorListContext,0);
	};

	RightBrace() {
	    return this.getToken(CParser.RightBrace, 0);
	};

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	Comma() {
	    return this.getToken(CParser.Comma, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterEnumSpecifier(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitEnumSpecifier(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitEnumSpecifier(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class EnumeratorListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_enumeratorList;
    }

	enumerator = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(EnumeratorContext);
	    } else {
	        return this.getTypedRuleContext(EnumeratorContext,i);
	    }
	};

	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterEnumeratorList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitEnumeratorList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitEnumeratorList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class EnumeratorContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_enumerator;
    }

	enumerationConstant() {
	    return this.getTypedRuleContext(EnumerationConstantContext,0);
	};

	Assign() {
	    return this.getToken(CParser.Assign, 0);
	};

	constantExpression() {
	    return this.getTypedRuleContext(ConstantExpressionContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterEnumerator(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitEnumerator(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitEnumerator(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class EnumerationConstantContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_enumerationConstant;
    }

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterEnumerationConstant(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitEnumerationConstant(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitEnumerationConstant(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class TypedefNameContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_typedefName;
    }

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterTypedefName(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitTypedefName(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitTypedefName(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ConstantExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_constantExpression;
    }

	conditionalExpression() {
	    return this.getTypedRuleContext(ConditionalExpressionContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterConstantExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitConstantExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitConstantExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class PointerContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_pointer;
    }

	Star = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Star);
	    } else {
	        return this.getToken(CParser.Star, i);
	    }
	};


	Caret = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Caret);
	    } else {
	        return this.getToken(CParser.Caret, i);
	    }
	};


	typeQualifierList = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(TypeQualifierListContext);
	    } else {
	        return this.getTypedRuleContext(TypeQualifierListContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterPointer(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitPointer(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitPointer(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class TypeQualifierContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_typeQualifier;
    }

	Const() {
	    return this.getToken(CParser.Const, 0);
	};

	Restrict() {
	    return this.getToken(CParser.Restrict, 0);
	};

	Volatile() {
	    return this.getToken(CParser.Volatile, 0);
	};

	Atomic() {
	    return this.getToken(CParser.Atomic, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterTypeQualifier(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitTypeQualifier(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitTypeQualifier(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class FunctionSpecifierContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_functionSpecifier;
    }

	Inline() {
	    return this.getToken(CParser.Inline, 0);
	};

	Noreturn() {
	    return this.getToken(CParser.Noreturn, 0);
	};

	gccAttributeSpecifier() {
	    return this.getTypedRuleContext(GccAttributeSpecifierContext,0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterFunctionSpecifier(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitFunctionSpecifier(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitFunctionSpecifier(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class GccAttributeSpecifierContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_gccAttributeSpecifier;
    }

	LeftParen = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.LeftParen);
	    } else {
	        return this.getToken(CParser.LeftParen, i);
	    }
	};


	gccAttributeList() {
	    return this.getTypedRuleContext(GccAttributeListContext,0);
	};

	RightParen = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.RightParen);
	    } else {
	        return this.getToken(CParser.RightParen, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterGccAttributeSpecifier(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitGccAttributeSpecifier(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitGccAttributeSpecifier(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class GccAttributeListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_gccAttributeList;
    }

	gccAttribute = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(GccAttributeContext);
	    } else {
	        return this.getTypedRuleContext(GccAttributeContext,i);
	    }
	};

	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterGccAttributeList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitGccAttributeList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitGccAttributeList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class GccAttributeContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_gccAttribute;
    }

	Comma() {
	    return this.getToken(CParser.Comma, 0);
	};

	LeftParen = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.LeftParen);
	    } else {
	        return this.getToken(CParser.LeftParen, i);
	    }
	};


	RightParen = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.RightParen);
	    } else {
	        return this.getToken(CParser.RightParen, i);
	    }
	};


	argumentExpressionList() {
	    return this.getTypedRuleContext(ArgumentExpressionListContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterGccAttribute(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitGccAttribute(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitGccAttribute(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class AlignmentSpecifierContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_alignmentSpecifier;
    }

	Alignas() {
	    return this.getToken(CParser.Alignas, 0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	typeName() {
	    return this.getTypedRuleContext(TypeNameContext,0);
	};

	constantExpression() {
	    return this.getTypedRuleContext(ConstantExpressionContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterAlignmentSpecifier(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitAlignmentSpecifier(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitAlignmentSpecifier(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DeclaratorContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_declarator;
    }

	directDeclarator() {
	    return this.getTypedRuleContext(DirectDeclaratorContext,0);
	};

	pointer() {
	    return this.getTypedRuleContext(PointerContext,0);
	};

	gccDeclaratorExtension = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(GccDeclaratorExtensionContext);
	    } else {
	        return this.getTypedRuleContext(GccDeclaratorExtensionContext,i);
	    }
	};

	IfDefine() {
	    return this.getToken(CParser.IfDefine, 0);
	};

	EndIfDefine() {
	    return this.getToken(CParser.EndIfDefine, 0);
	};

	ComplexDefine() {
	    return this.getToken(CParser.ComplexDefine, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDeclarator(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDeclarator(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDeclarator(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DirectDeclaratorContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_directDeclarator;
    }

	idName() {
	    return this.getTypedRuleContext(IdNameContext,0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	declarator() {
	    return this.getTypedRuleContext(DeclaratorContext,0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	Colon() {
	    return this.getToken(CParser.Colon, 0);
	};

	DigitSequence() {
	    return this.getToken(CParser.DigitSequence, 0);
	};

	pointer() {
	    return this.getTypedRuleContext(PointerContext,0);
	};

	directDeclarator() {
	    return this.getTypedRuleContext(DirectDeclaratorContext,0);
	};

	typeSpecifier() {
	    return this.getTypedRuleContext(TypeSpecifierContext,0);
	};

	LeftBracket() {
	    return this.getToken(CParser.LeftBracket, 0);
	};

	RightBracket() {
	    return this.getToken(CParser.RightBracket, 0);
	};

	typeQualifierList() {
	    return this.getTypedRuleContext(TypeQualifierListContext,0);
	};

	assignmentExpression() {
	    return this.getTypedRuleContext(AssignmentExpressionContext,0);
	};

	Static() {
	    return this.getToken(CParser.Static, 0);
	};

	Star() {
	    return this.getToken(CParser.Star, 0);
	};

	parameterTypeList() {
	    return this.getTypedRuleContext(ParameterTypeListContext,0);
	};

	identifierList() {
	    return this.getTypedRuleContext(IdentifierListContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDirectDeclarator(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDirectDeclarator(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDirectDeclarator(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class TypeQualifierListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_typeQualifierList;
    }

	typeQualifier = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(TypeQualifierContext);
	    } else {
	        return this.getTypedRuleContext(TypeQualifierContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterTypeQualifierList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitTypeQualifierList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitTypeQualifierList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class AssignmentExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_assignmentExpression;
    }

	conditionalExpression() {
	    return this.getTypedRuleContext(ConditionalExpressionContext,0);
	};

	unaryExpression() {
	    return this.getTypedRuleContext(UnaryExpressionContext,0);
	};

	assignmentOperator() {
	    return this.getTypedRuleContext(AssignmentOperatorContext,0);
	};

	assignmentExpression() {
	    return this.getTypedRuleContext(AssignmentExpressionContext,0);
	};

	DigitSequence() {
	    return this.getToken(CParser.DigitSequence, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterAssignmentExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitAssignmentExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitAssignmentExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ConditionalExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_conditionalExpression;
    }

	logicalOrExpression() {
	    return this.getTypedRuleContext(LogicalOrExpressionContext,0);
	};

	Question() {
	    return this.getToken(CParser.Question, 0);
	};

	expression() {
	    return this.getTypedRuleContext(ExpressionContext,0);
	};

	Colon() {
	    return this.getToken(CParser.Colon, 0);
	};

	conditionalExpression() {
	    return this.getTypedRuleContext(ConditionalExpressionContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterConditionalExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitConditionalExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitConditionalExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class LogicalOrExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_logicalOrExpression;
    }

	logicalAndExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(LogicalAndExpressionContext);
	    } else {
	        return this.getTypedRuleContext(LogicalAndExpressionContext,i);
	    }
	};

	OrOr = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.OrOr);
	    } else {
	        return this.getToken(CParser.OrOr, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterLogicalOrExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitLogicalOrExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitLogicalOrExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class LogicalAndExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_logicalAndExpression;
    }

	inclusiveOrExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(InclusiveOrExpressionContext);
	    } else {
	        return this.getTypedRuleContext(InclusiveOrExpressionContext,i);
	    }
	};

	AndAnd = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.AndAnd);
	    } else {
	        return this.getToken(CParser.AndAnd, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterLogicalAndExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitLogicalAndExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitLogicalAndExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class InclusiveOrExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_inclusiveOrExpression;
    }

	exclusiveOrExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(ExclusiveOrExpressionContext);
	    } else {
	        return this.getTypedRuleContext(ExclusiveOrExpressionContext,i);
	    }
	};

	Or = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Or);
	    } else {
	        return this.getToken(CParser.Or, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterInclusiveOrExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitInclusiveOrExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitInclusiveOrExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ExclusiveOrExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_exclusiveOrExpression;
    }

	andExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(AndExpressionContext);
	    } else {
	        return this.getTypedRuleContext(AndExpressionContext,i);
	    }
	};

	Caret = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Caret);
	    } else {
	        return this.getToken(CParser.Caret, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterExclusiveOrExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitExclusiveOrExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitExclusiveOrExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class AndExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_andExpression;
    }

	equalityExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(EqualityExpressionContext);
	    } else {
	        return this.getTypedRuleContext(EqualityExpressionContext,i);
	    }
	};

	And = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.And);
	    } else {
	        return this.getToken(CParser.And, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterAndExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitAndExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitAndExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class EqualityExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_equalityExpression;
    }

	relationalExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(RelationalExpressionContext);
	    } else {
	        return this.getTypedRuleContext(RelationalExpressionContext,i);
	    }
	};

	Equal = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Equal);
	    } else {
	        return this.getToken(CParser.Equal, i);
	    }
	};


	NotEqual = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.NotEqual);
	    } else {
	        return this.getToken(CParser.NotEqual, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterEqualityExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitEqualityExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitEqualityExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class RelationalExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_relationalExpression;
    }

	shiftExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(ShiftExpressionContext);
	    } else {
	        return this.getTypedRuleContext(ShiftExpressionContext,i);
	    }
	};

	Less = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Less);
	    } else {
	        return this.getToken(CParser.Less, i);
	    }
	};


	Greater = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Greater);
	    } else {
	        return this.getToken(CParser.Greater, i);
	    }
	};


	LessEqual = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.LessEqual);
	    } else {
	        return this.getToken(CParser.LessEqual, i);
	    }
	};


	GreaterEqual = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.GreaterEqual);
	    } else {
	        return this.getToken(CParser.GreaterEqual, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterRelationalExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitRelationalExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitRelationalExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ShiftExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_shiftExpression;
    }

	additiveExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(AdditiveExpressionContext);
	    } else {
	        return this.getTypedRuleContext(AdditiveExpressionContext,i);
	    }
	};

	LeftShift = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.LeftShift);
	    } else {
	        return this.getToken(CParser.LeftShift, i);
	    }
	};


	RightShift = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.RightShift);
	    } else {
	        return this.getToken(CParser.RightShift, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterShiftExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitShiftExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitShiftExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class AdditiveExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_additiveExpression;
    }

	multiplicativeExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(MultiplicativeExpressionContext);
	    } else {
	        return this.getTypedRuleContext(MultiplicativeExpressionContext,i);
	    }
	};

	Plus = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Plus);
	    } else {
	        return this.getToken(CParser.Plus, i);
	    }
	};


	Minus = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Minus);
	    } else {
	        return this.getToken(CParser.Minus, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterAdditiveExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitAdditiveExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitAdditiveExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class MultiplicativeExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_multiplicativeExpression;
    }

	castExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(CastExpressionContext);
	    } else {
	        return this.getTypedRuleContext(CastExpressionContext,i);
	    }
	};

	Star = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Star);
	    } else {
	        return this.getToken(CParser.Star, i);
	    }
	};


	Div = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Div);
	    } else {
	        return this.getToken(CParser.Div, i);
	    }
	};


	Mod = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Mod);
	    } else {
	        return this.getToken(CParser.Mod, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterMultiplicativeExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitMultiplicativeExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitMultiplicativeExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class CastExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_castExpression;
    }

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	typeName() {
	    return this.getTypedRuleContext(TypeNameContext,0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	castExpression() {
	    return this.getTypedRuleContext(CastExpressionContext,0);
	};

	unaryExpression() {
	    return this.getTypedRuleContext(UnaryExpressionContext,0);
	};

	DigitSequence() {
	    return this.getToken(CParser.DigitSequence, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterCastExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitCastExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitCastExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class UnaryExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_unaryExpression;
    }

	postfixExpression() {
	    return this.getTypedRuleContext(PostfixExpressionContext,0);
	};

	unaryOperator() {
	    return this.getTypedRuleContext(UnaryOperatorContext,0);
	};

	castExpression() {
	    return this.getTypedRuleContext(CastExpressionContext,0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	typeName() {
	    return this.getTypedRuleContext(TypeNameContext,0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	AndAnd() {
	    return this.getToken(CParser.AndAnd, 0);
	};

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	Sizeof = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Sizeof);
	    } else {
	        return this.getToken(CParser.Sizeof, i);
	    }
	};


	Alignof() {
	    return this.getToken(CParser.Alignof, 0);
	};

	PlusPlus = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.PlusPlus);
	    } else {
	        return this.getToken(CParser.PlusPlus, i);
	    }
	};


	MinusMinus = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.MinusMinus);
	    } else {
	        return this.getToken(CParser.MinusMinus, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterUnaryExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitUnaryExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitUnaryExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class PostfixExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_postfixExpression;
    }

	primaryExpression() {
	    return this.getTypedRuleContext(PrimaryExpressionContext,0);
	};

	LeftParen = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.LeftParen);
	    } else {
	        return this.getToken(CParser.LeftParen, i);
	    }
	};


	typeName() {
	    return this.getTypedRuleContext(TypeNameContext,0);
	};

	RightParen = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.RightParen);
	    } else {
	        return this.getToken(CParser.RightParen, i);
	    }
	};


	LeftBrace() {
	    return this.getToken(CParser.LeftBrace, 0);
	};

	initializerList() {
	    return this.getTypedRuleContext(InitializerListContext,0);
	};

	RightBrace() {
	    return this.getToken(CParser.RightBrace, 0);
	};

	LeftBracket = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.LeftBracket);
	    } else {
	        return this.getToken(CParser.LeftBracket, i);
	    }
	};


	expression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(ExpressionContext);
	    } else {
	        return this.getTypedRuleContext(ExpressionContext,i);
	    }
	};

	RightBracket = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.RightBracket);
	    } else {
	        return this.getToken(CParser.RightBracket, i);
	    }
	};


	Identifier = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Identifier);
	    } else {
	        return this.getToken(CParser.Identifier, i);
	    }
	};


	Dot = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Dot);
	    } else {
	        return this.getToken(CParser.Dot, i);
	    }
	};


	Arrow = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Arrow);
	    } else {
	        return this.getToken(CParser.Arrow, i);
	    }
	};


	PlusPlus = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.PlusPlus);
	    } else {
	        return this.getToken(CParser.PlusPlus, i);
	    }
	};


	MinusMinus = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.MinusMinus);
	    } else {
	        return this.getToken(CParser.MinusMinus, i);
	    }
	};


	Comma() {
	    return this.getToken(CParser.Comma, 0);
	};

	argumentExpressionList = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(ArgumentExpressionListContext);
	    } else {
	        return this.getTypedRuleContext(ArgumentExpressionListContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterPostfixExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitPostfixExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitPostfixExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class PrimaryExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_primaryExpression;
    }

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	Constant() {
	    return this.getToken(CParser.Constant, 0);
	};

	StringLiteral = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.StringLiteral);
	    } else {
	        return this.getToken(CParser.StringLiteral, i);
	    }
	};


	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	expression() {
	    return this.getTypedRuleContext(ExpressionContext,0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	genericSelection() {
	    return this.getTypedRuleContext(GenericSelectionContext,0);
	};

	compoundStatement() {
	    return this.getTypedRuleContext(CompoundStatementContext,0);
	};

	unaryExpression() {
	    return this.getTypedRuleContext(UnaryExpressionContext,0);
	};

	Comma() {
	    return this.getToken(CParser.Comma, 0);
	};

	typeName() {
	    return this.getTypedRuleContext(TypeNameContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterPrimaryExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitPrimaryExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitPrimaryExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class GenericSelectionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_genericSelection;
    }

	Generic() {
	    return this.getToken(CParser.Generic, 0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	assignmentExpression() {
	    return this.getTypedRuleContext(AssignmentExpressionContext,0);
	};

	Comma() {
	    return this.getToken(CParser.Comma, 0);
	};

	genericAssocList() {
	    return this.getTypedRuleContext(GenericAssocListContext,0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterGenericSelection(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitGenericSelection(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitGenericSelection(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class GenericAssocListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_genericAssocList;
    }

	genericAssociation = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(GenericAssociationContext);
	    } else {
	        return this.getTypedRuleContext(GenericAssociationContext,i);
	    }
	};

	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterGenericAssocList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitGenericAssocList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitGenericAssocList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class GenericAssociationContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_genericAssociation;
    }

	Colon() {
	    return this.getToken(CParser.Colon, 0);
	};

	assignmentExpression() {
	    return this.getTypedRuleContext(AssignmentExpressionContext,0);
	};

	typeName() {
	    return this.getTypedRuleContext(TypeNameContext,0);
	};

	Default() {
	    return this.getToken(CParser.Default, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterGenericAssociation(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitGenericAssociation(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitGenericAssociation(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ArgumentExpressionListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_argumentExpressionList;
    }

	assignmentExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(AssignmentExpressionContext);
	    } else {
	        return this.getTypedRuleContext(AssignmentExpressionContext,i);
	    }
	};

	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterArgumentExpressionList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitArgumentExpressionList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitArgumentExpressionList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class UnaryOperatorContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_unaryOperator;
    }

	And() {
	    return this.getToken(CParser.And, 0);
	};

	Star() {
	    return this.getToken(CParser.Star, 0);
	};

	Plus() {
	    return this.getToken(CParser.Plus, 0);
	};

	Minus() {
	    return this.getToken(CParser.Minus, 0);
	};

	Tilde() {
	    return this.getToken(CParser.Tilde, 0);
	};

	Not() {
	    return this.getToken(CParser.Not, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterUnaryOperator(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitUnaryOperator(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitUnaryOperator(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class AssignmentOperatorContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_assignmentOperator;
    }

	Assign() {
	    return this.getToken(CParser.Assign, 0);
	};

	StarAssign() {
	    return this.getToken(CParser.StarAssign, 0);
	};

	DivAssign() {
	    return this.getToken(CParser.DivAssign, 0);
	};

	ModAssign() {
	    return this.getToken(CParser.ModAssign, 0);
	};

	PlusAssign() {
	    return this.getToken(CParser.PlusAssign, 0);
	};

	MinusAssign() {
	    return this.getToken(CParser.MinusAssign, 0);
	};

	LeftShiftAssign() {
	    return this.getToken(CParser.LeftShiftAssign, 0);
	};

	RightShiftAssign() {
	    return this.getToken(CParser.RightShiftAssign, 0);
	};

	AndAssign() {
	    return this.getToken(CParser.AndAssign, 0);
	};

	XorAssign() {
	    return this.getToken(CParser.XorAssign, 0);
	};

	OrAssign() {
	    return this.getToken(CParser.OrAssign, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterAssignmentOperator(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitAssignmentOperator(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitAssignmentOperator(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ParameterTypeListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_parameterTypeList;
    }

	parameterList() {
	    return this.getTypedRuleContext(ParameterListContext,0);
	};

	Comma() {
	    return this.getToken(CParser.Comma, 0);
	};

	Ellipsis() {
	    return this.getToken(CParser.Ellipsis, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterParameterTypeList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitParameterTypeList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitParameterTypeList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ParameterListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_parameterList;
    }

	parameterDeclaration = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(ParameterDeclarationContext);
	    } else {
	        return this.getTypedRuleContext(ParameterDeclarationContext,i);
	    }
	};

	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterParameterList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitParameterList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitParameterList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ParameterDeclarationContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_parameterDeclaration;
    }

	declarationSpecifiers() {
	    return this.getTypedRuleContext(DeclarationSpecifiersContext,0);
	};

	declarator() {
	    return this.getTypedRuleContext(DeclaratorContext,0);
	};

	declarationSpecifiers2() {
	    return this.getTypedRuleContext(DeclarationSpecifiers2Context,0);
	};

	abstractDeclarator() {
	    return this.getTypedRuleContext(AbstractDeclaratorContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterParameterDeclaration(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitParameterDeclaration(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitParameterDeclaration(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DeclarationSpecifiers2Context extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_declarationSpecifiers2;
    }

	declarationSpecifier = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(DeclarationSpecifierContext);
	    } else {
	        return this.getTypedRuleContext(DeclarationSpecifierContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDeclarationSpecifiers2(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDeclarationSpecifiers2(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDeclarationSpecifiers2(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class AbstractDeclaratorContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_abstractDeclarator;
    }

	pointer() {
	    return this.getTypedRuleContext(PointerContext,0);
	};

	directAbstractDeclarator() {
	    return this.getTypedRuleContext(DirectAbstractDeclaratorContext,0);
	};

	gccDeclaratorExtension = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(GccDeclaratorExtensionContext);
	    } else {
	        return this.getTypedRuleContext(GccDeclaratorExtensionContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterAbstractDeclarator(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitAbstractDeclarator(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitAbstractDeclarator(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DirectAbstractDeclaratorContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_directAbstractDeclarator;
    }

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	abstractDeclarator() {
	    return this.getTypedRuleContext(AbstractDeclaratorContext,0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	gccDeclaratorExtension = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(GccDeclaratorExtensionContext);
	    } else {
	        return this.getTypedRuleContext(GccDeclaratorExtensionContext,i);
	    }
	};

	LeftBracket() {
	    return this.getToken(CParser.LeftBracket, 0);
	};

	RightBracket() {
	    return this.getToken(CParser.RightBracket, 0);
	};

	typeQualifierList() {
	    return this.getTypedRuleContext(TypeQualifierListContext,0);
	};

	assignmentExpression() {
	    return this.getTypedRuleContext(AssignmentExpressionContext,0);
	};

	Static() {
	    return this.getToken(CParser.Static, 0);
	};

	Star() {
	    return this.getToken(CParser.Star, 0);
	};

	parameterTypeList() {
	    return this.getTypedRuleContext(ParameterTypeListContext,0);
	};

	directAbstractDeclarator() {
	    return this.getTypedRuleContext(DirectAbstractDeclaratorContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDirectAbstractDeclarator(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDirectAbstractDeclarator(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDirectAbstractDeclarator(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class GccDeclaratorExtensionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_gccDeclaratorExtension;
    }

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	StringLiteral = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.StringLiteral);
	    } else {
	        return this.getToken(CParser.StringLiteral, i);
	    }
	};


	gccAttributeSpecifier() {
	    return this.getTypedRuleContext(GccAttributeSpecifierContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterGccDeclaratorExtension(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitGccDeclaratorExtension(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitGccDeclaratorExtension(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class IdNameContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_idName;
    }

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterIdName(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitIdName(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitIdName(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class IdentifierListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_identifierList;
    }

	Identifier = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Identifier);
	    } else {
	        return this.getToken(CParser.Identifier, i);
	    }
	};


	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterIdentifierList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitIdentifierList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitIdentifierList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class InitializerContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_initializer;
    }

	assignmentExpression() {
	    return this.getTypedRuleContext(AssignmentExpressionContext,0);
	};

	LeftBrace() {
	    return this.getToken(CParser.LeftBrace, 0);
	};

	initializerList() {
	    return this.getTypedRuleContext(InitializerListContext,0);
	};

	RightBrace() {
	    return this.getToken(CParser.RightBrace, 0);
	};

	Comma() {
	    return this.getToken(CParser.Comma, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterInitializer(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitInitializer(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitInitializer(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class InitializerListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_initializerList;
    }

	initializer = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(InitializerContext);
	    } else {
	        return this.getTypedRuleContext(InitializerContext,i);
	    }
	};

	designation = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(DesignationContext);
	    } else {
	        return this.getTypedRuleContext(DesignationContext,i);
	    }
	};

	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterInitializerList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitInitializerList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitInitializerList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DesignationContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_designation;
    }

	designatorList() {
	    return this.getTypedRuleContext(DesignatorListContext,0);
	};

	Assign() {
	    return this.getToken(CParser.Assign, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDesignation(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDesignation(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDesignation(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DesignatorListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_designatorList;
    }

	designator = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(DesignatorContext);
	    } else {
	        return this.getTypedRuleContext(DesignatorContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDesignatorList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDesignatorList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDesignatorList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class DesignatorContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_designator;
    }

	LeftBracket() {
	    return this.getToken(CParser.LeftBracket, 0);
	};

	constantExpression() {
	    return this.getTypedRuleContext(ConstantExpressionContext,0);
	};

	RightBracket() {
	    return this.getToken(CParser.RightBracket, 0);
	};

	Dot() {
	    return this.getToken(CParser.Dot, 0);
	};

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterDesignator(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitDesignator(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitDesignator(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class StatementContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_statement;
    }

	labeledStatement() {
	    return this.getTypedRuleContext(LabeledStatementContext,0);
	};

	compoundStatement() {
	    return this.getTypedRuleContext(CompoundStatementContext,0);
	};

	expressionStatement() {
	    return this.getTypedRuleContext(ExpressionStatementContext,0);
	};

	selectionStatement() {
	    return this.getTypedRuleContext(SelectionStatementContext,0);
	};

	iterationStatement() {
	    return this.getTypedRuleContext(IterationStatementContext,0);
	};

	jumpStatement() {
	    return this.getTypedRuleContext(JumpStatementContext,0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	Semi() {
	    return this.getToken(CParser.Semi, 0);
	};

	Volatile() {
	    return this.getToken(CParser.Volatile, 0);
	};

	logicalOrExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(LogicalOrExpressionContext);
	    } else {
	        return this.getTypedRuleContext(LogicalOrExpressionContext,i);
	    }
	};

	Colon = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Colon);
	    } else {
	        return this.getToken(CParser.Colon, i);
	    }
	};


	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterStatement(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitStatement(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitStatement(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class NestedParenthesesBlockContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_nestedParenthesesBlock;
    }

	LeftParen = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.LeftParen);
	    } else {
	        return this.getToken(CParser.LeftParen, i);
	    }
	};


	nestedParenthesesBlock = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(NestedParenthesesBlockContext);
	    } else {
	        return this.getTypedRuleContext(NestedParenthesesBlockContext,i);
	    }
	};

	RightParen = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.RightParen);
	    } else {
	        return this.getToken(CParser.RightParen, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterNestedParenthesesBlock(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitNestedParenthesesBlock(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitNestedParenthesesBlock(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class LabeledStatementContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_labeledStatement;
    }

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	Colon() {
	    return this.getToken(CParser.Colon, 0);
	};

	statement() {
	    return this.getTypedRuleContext(StatementContext,0);
	};

	Case() {
	    return this.getToken(CParser.Case, 0);
	};

	constantExpression() {
	    return this.getTypedRuleContext(ConstantExpressionContext,0);
	};

	Default() {
	    return this.getToken(CParser.Default, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterLabeledStatement(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitLabeledStatement(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitLabeledStatement(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class CompoundStatementContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_compoundStatement;
    }

	LeftBrace() {
	    return this.getToken(CParser.LeftBrace, 0);
	};

	RightBrace() {
	    return this.getToken(CParser.RightBrace, 0);
	};

	blockItemList() {
	    return this.getTypedRuleContext(BlockItemListContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterCompoundStatement(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitCompoundStatement(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitCompoundStatement(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ExpressionStatementContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_expressionStatement;
    }

	Semi() {
	    return this.getToken(CParser.Semi, 0);
	};

	expression() {
	    return this.getTypedRuleContext(ExpressionContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterExpressionStatement(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitExpressionStatement(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitExpressionStatement(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class SelectionStatementContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_selectionStatement;
    }

	If() {
	    return this.getToken(CParser.If, 0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	expression() {
	    return this.getTypedRuleContext(ExpressionContext,0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	statement = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(StatementContext);
	    } else {
	        return this.getTypedRuleContext(StatementContext,i);
	    }
	};

	Else() {
	    return this.getToken(CParser.Else, 0);
	};

	Switch() {
	    return this.getToken(CParser.Switch, 0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterSelectionStatement(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitSelectionStatement(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitSelectionStatement(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class IterationStatementContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_iterationStatement;
    }

	While() {
	    return this.getToken(CParser.While, 0);
	};

	LeftParen() {
	    return this.getToken(CParser.LeftParen, 0);
	};

	expression() {
	    return this.getTypedRuleContext(ExpressionContext,0);
	};

	RightParen() {
	    return this.getToken(CParser.RightParen, 0);
	};

	statement() {
	    return this.getTypedRuleContext(StatementContext,0);
	};

	Do() {
	    return this.getToken(CParser.Do, 0);
	};

	Semi() {
	    return this.getToken(CParser.Semi, 0);
	};

	For() {
	    return this.getToken(CParser.For, 0);
	};

	forCondition() {
	    return this.getTypedRuleContext(ForConditionContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterIterationStatement(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitIterationStatement(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitIterationStatement(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ForConditionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_forCondition;
    }

	Semi = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Semi);
	    } else {
	        return this.getToken(CParser.Semi, i);
	    }
	};


	forDeclaration() {
	    return this.getTypedRuleContext(ForDeclarationContext,0);
	};

	forExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(ForExpressionContext);
	    } else {
	        return this.getTypedRuleContext(ForExpressionContext,i);
	    }
	};

	expression() {
	    return this.getTypedRuleContext(ExpressionContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterForCondition(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitForCondition(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitForCondition(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ForDeclarationContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_forDeclaration;
    }

	declarationSpecifiers() {
	    return this.getTypedRuleContext(DeclarationSpecifiersContext,0);
	};

	initDeclaratorList() {
	    return this.getTypedRuleContext(InitDeclaratorListContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterForDeclaration(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitForDeclaration(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitForDeclaration(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ForExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_forExpression;
    }

	assignmentExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(AssignmentExpressionContext);
	    } else {
	        return this.getTypedRuleContext(AssignmentExpressionContext,i);
	    }
	};

	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterForExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitForExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitForExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class JumpStatementContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_jumpStatement;
    }

	Semi() {
	    return this.getToken(CParser.Semi, 0);
	};

	Goto() {
	    return this.getToken(CParser.Goto, 0);
	};

	Identifier() {
	    return this.getToken(CParser.Identifier, 0);
	};

	Return() {
	    return this.getToken(CParser.Return, 0);
	};

	unaryExpression() {
	    return this.getTypedRuleContext(UnaryExpressionContext,0);
	};

	Continue() {
	    return this.getToken(CParser.Continue, 0);
	};

	Break() {
	    return this.getToken(CParser.Break, 0);
	};

	expression() {
	    return this.getTypedRuleContext(ExpressionContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterJumpStatement(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitJumpStatement(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitJumpStatement(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class ExpressionContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_expression;
    }

	assignmentExpression = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(AssignmentExpressionContext);
	    } else {
	        return this.getTypedRuleContext(AssignmentExpressionContext,i);
	    }
	};

	Comma = function(i) {
		if(i===undefined) {
			i = null;
		}
	    if(i===null) {
	        return this.getTokens(CParser.Comma);
	    } else {
	        return this.getToken(CParser.Comma, i);
	    }
	};


	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterExpression(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitExpression(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitExpression(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class BlockItemListContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_blockItemList;
    }

	blockItem = function(i) {
	    if(i===undefined) {
	        i = null;
	    }
	    if(i===null) {
	        return this.getTypedRuleContexts(BlockItemContext);
	    } else {
	        return this.getTypedRuleContext(BlockItemContext,i);
	    }
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterBlockItemList(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitBlockItemList(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitBlockItemList(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}



class BlockItemContext extends antlr4.ParserRuleContext {

    constructor(parser, parent, invokingState) {
        if(parent===undefined) {
            parent = null;
        }
        if(invokingState===undefined || invokingState===null) {
            invokingState = -1;
        }
        super(parent, invokingState);
        this.parser = parser;
        this.ruleIndex = CParser.RULE_blockItem;
    }

	statement() {
	    return this.getTypedRuleContext(StatementContext,0);
	};

	declaration() {
	    return this.getTypedRuleContext(DeclarationContext,0);
	};

	enterRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.enterBlockItem(this);
		}
	}

	exitRule(listener) {
	    if(listener instanceof CListener ) {
	        listener.exitBlockItem(this);
		}
	}

	accept(visitor) {
	    if ( visitor instanceof CVisitor ) {
	        return visitor.visitBlockItem(this);
	    } else {
	        return visitor.visitChildren(this);
	    }
	}


}




CParser.CompilationUnitContext = CompilationUnitContext; 
CParser.TranslationUnitContext = TranslationUnitContext; 
CParser.ExternalDeclarationContext = ExternalDeclarationContext; 
CParser.FunctionDefinitionContext = FunctionDefinitionContext; 
CParser.DeclarationListContext = DeclarationListContext; 
CParser.DeclarationContext = DeclarationContext; 
CParser.DeclarationSpecifiersContext = DeclarationSpecifiersContext; 
CParser.InitDeclaratorListContext = InitDeclaratorListContext; 
CParser.InitDeclaratorContext = InitDeclaratorContext; 
CParser.StaticAssertDeclarationContext = StaticAssertDeclarationContext; 
CParser.DeclarationSpecifierContext = DeclarationSpecifierContext; 
CParser.StorageClassSpecifierContext = StorageClassSpecifierContext; 
CParser.TypeSpecifierContext = TypeSpecifierContext; 
CParser.AtomicTypeSpecifierContext = AtomicTypeSpecifierContext; 
CParser.TypeNameContext = TypeNameContext; 
CParser.StructOrUnionSpecifierContext = StructOrUnionSpecifierContext; 
CParser.StructOrUnionContext = StructOrUnionContext; 
CParser.StructDeclarationListContext = StructDeclarationListContext; 
CParser.StructDeclarationContext = StructDeclarationContext; 
CParser.SpecifierQualifierListContext = SpecifierQualifierListContext; 
CParser.StructDeclaratorListContext = StructDeclaratorListContext; 
CParser.StructDeclaratorContext = StructDeclaratorContext; 
CParser.EnumSpecifierContext = EnumSpecifierContext; 
CParser.EnumeratorListContext = EnumeratorListContext; 
CParser.EnumeratorContext = EnumeratorContext; 
CParser.EnumerationConstantContext = EnumerationConstantContext; 
CParser.TypedefNameContext = TypedefNameContext; 
CParser.ConstantExpressionContext = ConstantExpressionContext; 
CParser.PointerContext = PointerContext; 
CParser.TypeQualifierContext = TypeQualifierContext; 
CParser.FunctionSpecifierContext = FunctionSpecifierContext; 
CParser.GccAttributeSpecifierContext = GccAttributeSpecifierContext; 
CParser.GccAttributeListContext = GccAttributeListContext; 
CParser.GccAttributeContext = GccAttributeContext; 
CParser.AlignmentSpecifierContext = AlignmentSpecifierContext; 
CParser.DeclaratorContext = DeclaratorContext; 
CParser.DirectDeclaratorContext = DirectDeclaratorContext; 
CParser.TypeQualifierListContext = TypeQualifierListContext; 
CParser.AssignmentExpressionContext = AssignmentExpressionContext; 
CParser.ConditionalExpressionContext = ConditionalExpressionContext; 
CParser.LogicalOrExpressionContext = LogicalOrExpressionContext; 
CParser.LogicalAndExpressionContext = LogicalAndExpressionContext; 
CParser.InclusiveOrExpressionContext = InclusiveOrExpressionContext; 
CParser.ExclusiveOrExpressionContext = ExclusiveOrExpressionContext; 
CParser.AndExpressionContext = AndExpressionContext; 
CParser.EqualityExpressionContext = EqualityExpressionContext; 
CParser.RelationalExpressionContext = RelationalExpressionContext; 
CParser.ShiftExpressionContext = ShiftExpressionContext; 
CParser.AdditiveExpressionContext = AdditiveExpressionContext; 
CParser.MultiplicativeExpressionContext = MultiplicativeExpressionContext; 
CParser.CastExpressionContext = CastExpressionContext; 
CParser.UnaryExpressionContext = UnaryExpressionContext; 
CParser.PostfixExpressionContext = PostfixExpressionContext; 
CParser.PrimaryExpressionContext = PrimaryExpressionContext; 
CParser.GenericSelectionContext = GenericSelectionContext; 
CParser.GenericAssocListContext = GenericAssocListContext; 
CParser.GenericAssociationContext = GenericAssociationContext; 
CParser.ArgumentExpressionListContext = ArgumentExpressionListContext; 
CParser.UnaryOperatorContext = UnaryOperatorContext; 
CParser.AssignmentOperatorContext = AssignmentOperatorContext; 
CParser.ParameterTypeListContext = ParameterTypeListContext; 
CParser.ParameterListContext = ParameterListContext; 
CParser.ParameterDeclarationContext = ParameterDeclarationContext; 
CParser.DeclarationSpecifiers2Context = DeclarationSpecifiers2Context; 
CParser.AbstractDeclaratorContext = AbstractDeclaratorContext; 
CParser.DirectAbstractDeclaratorContext = DirectAbstractDeclaratorContext; 
CParser.GccDeclaratorExtensionContext = GccDeclaratorExtensionContext; 
CParser.IdNameContext = IdNameContext; 
CParser.IdentifierListContext = IdentifierListContext; 
CParser.InitializerContext = InitializerContext; 
CParser.InitializerListContext = InitializerListContext; 
CParser.DesignationContext = DesignationContext; 
CParser.DesignatorListContext = DesignatorListContext; 
CParser.DesignatorContext = DesignatorContext; 
CParser.StatementContext = StatementContext; 
CParser.NestedParenthesesBlockContext = NestedParenthesesBlockContext; 
CParser.LabeledStatementContext = LabeledStatementContext; 
CParser.CompoundStatementContext = CompoundStatementContext; 
CParser.ExpressionStatementContext = ExpressionStatementContext; 
CParser.SelectionStatementContext = SelectionStatementContext; 
CParser.IterationStatementContext = IterationStatementContext; 
CParser.ForConditionContext = ForConditionContext; 
CParser.ForDeclarationContext = ForDeclarationContext; 
CParser.ForExpressionContext = ForExpressionContext; 
CParser.JumpStatementContext = JumpStatementContext; 
CParser.ExpressionContext = ExpressionContext; 
CParser.BlockItemListContext = BlockItemListContext; 
CParser.BlockItemContext = BlockItemContext; 
